python pandas分组聚合详细

目录

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=0level=\'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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容