回顾
在数据处理进阶pandas入门(十四)中,我们介绍了pandas中的去重与替换,需要掌握去重方法duplicates()方法和drop_duplicates()方法以及替换方法replace()的基本用法。今天我们讲一下pandas中分组的相关内容。
分组方法groupby()
在对数据进行处理的时候,我们常常会用到分组。pandas为我们提供了groupby()方法来进行分组。分组的具体过程如下:首先根据某些条件将数据拆分成组,然后对每个组独立应用函数方法进行相应的数据运算或处理,最后将结果合并到一个数据结构中。
pandas主要针对DataFrame进行分组操作。DataFrame可以在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各分组并生成一个新值,然后函数执行结果被合并到最终的结果对象中。下面我们看一下groupby()方法的基本用法。
import numpy as npimport pandas as pddf = 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())
运行结果如下图所示。注意,groupby()方法的返回结果只是一个groupby对象,是一个中间数据,只有进行计算后的结果才会生成一个新的DataFrame。上述代码中对列A进行分组,A中共有a、b两个值,所以会被分成两组,进行求平均值计算,而列B是字符数据,所以会自动过滤,只对列C和列D进行分组后的计算。

groupby()基本用法
groupby()也支持多个参考分组,使用“[]”,基本用法如下。
import numpy as npimport pandas as pddf = 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”八个组合,分组后会将重复的组合合并计算,并自动进行排序。运行结果如下图所示。

多个参考分组
此外,我们还可以对分组后的结果进行指定序列计算。例如,我们以“A”为参考进行分组,然后只想得到对列“C”的运算结果,就可以使用groupby('A')['C']这样的方式实现。基本用法如下。
import numpy as npimport pandas as pddf = 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的运算结果。

指定分组操作
提取groupby分组
groupby()方法的返回结果虽然是一个groupby对象,但我们可以通过将它转换成列表得到一个可迭代的对象。
import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b'], 'B':[1, 2, 4, 3]})print(df)print("---------------")# 生成可迭代的元组列表listprint(list(df.groupby('A')))print("---------------")list_df = list(df.groupby('A'))print(list_df[0])print("---------------")# n是组名 df是分组后的DataFramefor n, df in list_df: print(n) print("#####") print(df) print("---------------")
我们将groupby对象转换成列表后进行遍历,可以看到,列表的每个元素都是一个元组,其中第一个元素是分组后的组名,第二个元素是分组后的DataFrame,运行结果如下图所示。

遍历groupby列表
通过上述的操作我们知道groupby对象其实是可迭代的,所以我们可以提取分组后的DataFrame。pandas中为我们提供了两个方法:get_group()和groups。
首先看一下get_group()方法,传入要提取的组名即可。基本用法如下。
import numpy as npimport pandas as pddf = 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'))
运行结果如下图所示。

get_group()基本用法
groups是将分组后的groups转成字典,要注意的是,字典的value部分是原DataFrame的索引,即对应的分组组名所在的索引值。基本用法如下。
import numpy as npimport pandas as pddf = 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'])
运行结果如下图所示。

groups提取
对于多个参考分组后的groupby对象,get_group()方法与groups同样适用,用法也基本一致。
import numpy as npimport pandas as pddf = 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中分组的相关知识,重点掌握groupby()方法的基本概念与用法,以及对分组的提取方法get_group()和groups的用法与差别。感谢大家的支持与关注,欢迎批评指正,一起讨论~