python–pandas分组聚合

分组聚合是数据处理中常见的场景,在pandas中用groupby方法实现分组操作,用agg方法实现聚合操作。

  • python3.9
  • win10 64bit
  • pandas==1.2.1

groupby方法是pandas中的分组方法,对数据框采用 groupby方法后,返回的是 DataFrameGroupBy对象,一般分组操作后会进行聚合操作。

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'>
</class></class>

可以对分组后的数据框直接使用聚合方法 agg,对分组数据框的每一列计算统计函数值。


df.groupby('A').agg('sum')
   B   C
A
1  3  14
2  7  10

可以根据数据框外的序列数据对数据框进行分组,需要注意 序列长度需要与数据框行数相同


label=['a','a','b','b']

df.groupby(label).agg('sum')
   A  B   C
a  2  3  14
b  4  7  10

可以根据数据框的多列对数据框进行分组。


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

可以根据索引对数据框进行分组,需要设置 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

分组后一般会进行聚合操作,用 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

对分组后数据框使用单个函数进行聚合,单个聚合函数会对每列进行计算,然后合并返回。聚合函数以字符串的形式传入。


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

聚合函数可以是多个函数。聚合时,多个聚合函数会对每列进行计算,然后合并返回。聚合函数以列表的形式传入。


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'})

可以重命名聚合后的列名,注意 只能对一列传入一个聚合函数时有效


df.groupby('A').agg(B_sum=('B','sum'),C_mean=('C','mean'))
   B_sum  C_mean
A
1      7       7
2      6       5

Original: https://blog.csdn.net/jhr112/article/details/115251345
Author: FTDdata
Title: python–pandas分组聚合

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/741878/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球