目录
python pandas分组聚合1、环境2、分组3、序列分组4、多列分组5、索引分组7、聚合8、单函数对多列9、多函数对多列
python pandas分组聚合
1、环境
python3.9
win10 64bit
pandas==1.2.1
groupby
方法是pandas中的分组方法,对数据框采用groupby
方法后,返回的是DataFrameGroupBy
对象,一般分组操作后会进行聚合操作。
2、分组
import pandas as pd import numpy as np pd.set_option(\'display.notebook_repr_html\',False) # 数据准备 df = pd.DataFrame({\'A\': [1, 1, 2, 2],\'B\': [1, 2, 3, 4],\'C\':[6,8,1,9]}) df
A B C 0 1 1 6 1 1 2 8 2 2 3 1 3 2 4 9
对数据框按A
列进行分组,产生分组数据框。分组数据框是可迭代对象,可以进行循环遍历,可以看出在循环中,每个元素的类型是元组,
元组的第一个元素是分组值,第二个元素是对应的分组数据框。
# 分组 g_df=df.groupby(\'A\') # 分组数据框类 type(g_df)
pandas.core.groupby.generic.DataFrameGroupBy
# 循环分组数据 for i in g_df: print(i,type(i),end=\'\\n\\n\')
(1, A B C 0 1 1 6 1 1 2 8) <class \'tuple\'>
(2, A B C 2 2 3 1 3 2 4 9) <class \'tuple\'>
可以对分组后的数据框直接使用聚合方法agg
,对分组数据框的每一列计算统计函数值。
# 分组求和 df.groupby(\'A\').agg(\'sum\') B C A 1 3 14 2 7 10
3、序列分组
可以根据数据框外的序列数据对数据框进行分组,需要注意序列长度需要与数据框行数相同。
# 定义分组列表 label=[\'a\',\'a\',\'b\',\'b\'] # 分组求和 df.groupby(label).agg(\'sum\') A B C a 2 3 14 b 4 7 10
4、多列分组
可以根据数据框的多列对数据框进行分组。
# 数据准备 df = pd.DataFrame({\'A\': [1, 1, 2, 2],\'B\': [3, 4, 3, 3],\'C\':[6,8,1,9]}) df
A B C 0 1 3 6 1 1 4 8 2 2 3 1 3 2 3 9
根据A
,B
列进行分组,然后求和。
# 根据多列分组求和 df.groupby([\'A\',\'B\']).agg(\'sum\')
C A B 1 3 6 4 8 2 3 10
5、索引分组
可以根据索引对数据框进行分组,需要设置level参数。
# 数据准备 df = pd.DataFrame({\'A\': [1, 1, 2, 2],\'B\': [3, 4, 3, 3],\'C\':[6,8,1,9]},index=[\'a\',\'a\',\'b\',\'b\']) df
A B C a 1 3 6 a 1 4 8 b 2 3 1 b 2 3 9
数据框只有一层索引,设置参数level=0
。
# 根据索引分组求和 df.groupby(level=0).agg(\'sum\') A B C a 2 7 14 b 4 6 10
当数据框索引有多层时,也可以根据需求设置level参数,完成分组聚合。
# 数据准备 mi=pd.MultiIndex.from_arrays([[1,1,2,2],[3,4,3,3]],names=[\'id1\',\'id2\']) df=pd.DataFrame(dict(value=[4,7,2,9]),index=mi) df
value id1 id2 1 3 4 4 7 2 3 2 3 9
设置level
参数,如需要根据第一层索引,即id1进行分组,可以设置level=0
或level=\'id1\'
完成分组聚合。
# 根据第一层索引分组求和 df.groupby(level=0).agg(\'sum\')
value id1 1 11 2 11
# 根据第一层索引分组求和 df.groupby(level=\'id1\').agg(\'sum\')
value id1 1 11 2 11
7、聚合
分组后一般会进行聚合操作,用agg
方法进行聚合。
# 数据准备 df = pd.DataFrame({\'A\': [1, 1, 2, 2],\'B\': [3, 4, 3, 3],\'C\':[6,8,1,9],\'D\':[2,5,4,8]}) df
A B C D 0 1 3 6 2 1 1 4 8 5 2 2 3 1 4 3 2 3 9 8
8、单函数对多列
对分组后数据框使用单个函数进行聚合,单个聚合函数会对每列进行计算,然后合并返回。聚合函数以字符串的形式传入。
# 对所有列分组求和 df.groupby(\'A\').agg(\'sum\')
B C D A 1 7 14 7 2 6 10 12
可以对分组后的数据指定列进行分组聚合。需要注意子列需要用[]包裹
。
# 对指定列分组求和 df.groupby(\'A\')[[\'B\',\'C\']].agg(\'sum\')
B C A 1 7 14 2 6 10
聚合函数也可以传入自定义的匿名函数。
# 匿名函数分组求和 df.groupby(\'A\').agg(lambda x:sum(x))
B C D A 1 7 14 7 2 6 10 12
9、多函数对多列
聚合函数可以是多个函数。聚合时,多个聚合函数会对每列进行计算,然后合并返回。聚合函数以列表的形式传入。
# 全部列多函数聚合 df.groupby(\'A\').agg([\'sum\',\'mean\'])
B C D sum mean sum mean sum mean A 1 7 3.5 14 7 7 3.5 2 6 3.0 10 5 12 6.0
聚合返回后的数据列名有两层索引,第一层是聚合的列名,第二层是使用的聚合函数名。如果需要对返回的聚合函数名重命名,
需要在传参时,传入元组,第一个元素为聚合函数名,第二个元素为聚合函数。
# 聚合函数重命名 df.groupby(\'A\').agg([(\'SUM\',\'sum\'),(\'MEAN\',\'mean\')])
B C D SUM MEAN SUM MEAN SUM MEAN A 1 7 3.5 14 7 7 3.5 2 6 3.0 10 5 12 6.0
同样,也可以传入匿名函数。
# 匿名函数并重命名 df.groupby(\'A\').agg([(\'SUM\',\'sum\'),(\'MAX\',lambda x:max(x))])
B C D SUM MAX SUM MAX SUM MAX A 1 7 4 14 8 7 5 2 6 3 10 9 12 8
如果需要对不同的列进行不同的聚合计算,则需要传入字典的形式。
# 不同列不同聚合函数 df.groupby(\'A\').agg({\'B\':[\'sum\',\'mean\'],\'C\':\'mean\'})
B C sum mean mean A 1 7 3.5 7 2 6 3.0 5
可以重命名聚合后的列名,注意只能对一列传入一个聚合函数时有效
。
# 聚合后重命名列名 df.groupby(\'A\').agg(B_sum=(\'B\',\'sum\'),C_mean=(\'C\',\'mean\'))
B_sum C_mean A 1 7 7 2 6 5
暂无评论内容