数据处理进阶pandas入门(十五)

时间:2019-11-06 08:40:01 来源:金融商报 当前位置:bet365手机版中文_英国bet365提现要多久_bet365最新体育备用网站 > 365bet体育在线台湾 > 手机阅读

回顾

在数据处理进阶pandas入门(十四)中,我们介绍了pandas中的去重与替换,需要掌握去重方法duplicates()方法和drop_duplicates()方法以及替换方法replace()的基本用法。今天我们讲一下pandas中分组的相关内容。

分组方法groupby()

在对数据进行处理的时候,我们常常会用到分组。pandas为我们提供了groupby()方法来进行分组。分组的具体过程如下:首先根据某些条件将数据拆分成组,然后对每个组独立应用函数方法进行相应的数据运算或处理,最后将结果合并到一个数据结构中。

pandas主要针对DataFrame进行分组操作。DataFrame可以在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各分组并生成一个新值,然后函数执行结果被合并到最终的结果对象中。下面我们看一下groupby()方法的基本用法。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],
'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
print(df)
print("---------------")
# groupby()返回结果是一个groupby对象,是一个中间数据,没有进行计算
print(df.groupby('A'))
print("---------------")
print(df.groupby('A').mean())

365bet体育在线台湾 运行结果如下图所示。注意,groupby()方法的返回结果只是一个groupby对象,是一个中间数据,只有进行计算后的结果才会生成一个新的DataFrame。上述代码中对列A进行分组,A中共有a、b两个值,所以会被分成两组,进行求平均值计算,而列B是字符数据,所以会自动过滤,只对列C和列D进行分组后的计算。

数据处理进阶pandas入门(十五)

groupby()基本用法

groupby()也支持多个参考分组,使用“[]”,基本用法如下。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],
'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
print(df)
print("---------------")
print(df.groupby(['A', 'B']).mean())

上述代码中我们同时以“A”、“B”为参考进行分组,依次有“a c”、“b c”、“a d”、“b e”、“a b”、“b b”、“a a”、“a c”八个组合,分组后会将重复的组合合并计算,并自动进行排序。运行结果如下图所示。

数据处理进阶pandas入门(十五)

多个参考分组

此外,我们还可以对分组后的结果进行指定序列计算。例如,我们以“A”为参考进行分组,然后只想得到对列“C”的运算结果,就可以使用groupby('A')['C']这样的方式实现。基本用法如下。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],
'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
print(df)
print("---------------")
# 以A分组求C的平均值
print(df.groupby('A')['C'].mean())
print("---------------")
print(df.groupby('A').mean())

运行结果如下图所示。当我们使用groupby('A')['C']时,只得到了列C的运算结果。

数据处理进阶pandas入门(十五)

指定分组操作

提取groupby分组

groupby()方法的返回结果虽然是一个groupby对象,但我们可以通过将它转换成列表得到一个可迭代的对象。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b'],
'B':[1, 2, 4, 3]})
print(df)
print("---------------")
# 生成可迭代的元组列表list
print(list(df.groupby('A')))
print("---------------")
list_df = list(df.groupby('A'))
print(list_df[0])
print("---------------")
# n是组名 df是分组后的DataFrame
for n, df in list_df:
print(n)
print("#####")
print(df)
print("---------------")

我们将groupby对象转换成列表后进行遍历,可以看到,列表的每个元素都是一个元组,其中第一个元素是分组后的组名,第二个元素是分组后的DataFrame,运行结果如下图所示。

数据处理进阶pandas入门(十五)

遍历groupby列表

通过上述的操作我们知道groupby对象其实是可迭代的,所以我们可以提取分组后的DataFrame。pandas中为我们提供了两个方法:get_group()和groups。

首先看一下get_group()方法,传入要提取的组名即可。基本用法如下。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b'],
'B':[1, 2, 4, 3]})
print(df)
print("---------------")
list_df = df.groupby('A')
print(list_df.size())
print("---------------")
print(list_df.get_group('a'))
print("---------------")
print(list_df.get_group('b'))

运行结果如下图所示。

数据处理进阶pandas入门(十五)

get_group()基本用法

groups是将分组后的groups转成字典,要注意的是,字典的value部分是原DataFrame的索引,即对应的分组组名所在的索引值。基本用法如下。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b'],
'B':[1, 2, 4, 3]})
print(df)
print("---------------")
list_df = df.groupby('A')
# 将分组后的groups转成字典
print(list_df.groups)
print("---------------")
print(list_df.groups['a'])

运行结果如下图所示。

数据处理进阶pandas入门(十五)

groups提取

对于多个参考分组后的groupby对象,get_group()方法与groups同样适用,用法也基本一致。?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],
'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
print(df)
print("---------------")
list_df = df.groupby(['A', 'B'])
print(list_df.groups)
print("---------------")
print(list_df.get_group(('a', 'c')))

运行结果如下图所示。

数据处理进阶pandas入门(十五)

多个参考分组提取

总结

以上内容介绍了pandas中分组的相关知识,重点掌握groupby()方法的基本概念与用法,以及对分组的提取方法get_group()和groups的用法与差别。感谢大家的支持与关注,欢迎批评指正,一起讨论~

?

?

娱乐本月排行

娱乐精选