python pandas分组聚合
1、环境
- python3.9
- win10 64bit
- pandas==1.2.1
groupby
方法是pandas中的分组方法,对数据框采用groupby
方法后,返回的是DataFrameGroupBy
对象,一般分组操作后会进行聚合操作。
2、分组
1
2
3
4
5
6
|
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
|
1
2
3
4
5
|
A B C
0 1 1 6
1 1 2 8
2 2 3 1
3 2 4 9
|
对数据框按A
列进行分组,产生分组数据框。分组数据框是可迭代对象,可以进行循环遍历,可以看出在循环中,每个元素的类型是元组,
元组的第一个元素是分组值,第二个元素是对应的分组数据框。
1
2
3
4
|
# 分组
g_df = df.groupby( 'A' )
# 分组数据框类
type (g_df)
|
1
|
pandas.core.groupby.generic.DataFrameGroupBy
|
1
2
3
|
# 循环分组数据
for i in g_df:
print (i, type (i),end = '\n\n' )
|
1
2
3
|
( 1 , A B C
0 1 1 6
1 1 2 8 ) < class 'tuple' >
|
1
2
3
|
( 2 , A B C
2 2 3 1
3 2 4 9 ) < class 'tuple' >
|
可以对分组后的数据框直接使用聚合方法agg
,对分组数据框的每一列计算统计函数值。
1
2
3
4
5
6
|
# 分组求和
df.groupby( 'A' ).agg( 'sum' )
B C
A
1 3 14
2 7 10
|
3、序列分组
可以根据数据框外的序列数据对数据框进行分组,需要注意序列长度需要与数据框行数相同。
1
2
3
4
5
6
7
|
# 定义分组列表
label = [ 'a' , 'a' , 'b' , 'b' ]
# 分组求和
df.groupby(label).agg( 'sum' )
A B C
a 2 3 14
b 4 7 10
|
4、多列分组
可以根据数据框的多列对数据框进行分组。
1
2
3
|
# 数据准备
df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 3 , 4 , 3 , 3 ], 'C' :[ 6 , 8 , 1 , 9 ]})
df
|
1
2
3
4
5
|
A B C
0 1 3 6
1 1 4 8
2 2 3 1
3 2 3 9
|
根据A
,B
列进行分组,然后求和。
1
2
|
# 根据多列分组求和
df.groupby([ 'A' , 'B' ]).agg( 'sum' )
|
1
2
3
4
5
|
C
A B
1 3 6
4 8
2 3 10
|
5、索引分组
可以根据索引对数据框进行分组,需要设置level参数。
1
2
3
|
# 数据准备
df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 3 , 4 , 3 , 3 ], 'C' :[ 6 , 8 , 1 , 9 ]},index = [ 'a' , 'a' , 'b' , 'b' ])
df
|
1
2
3
4
5
|
A B C
a 1 3 6
a 1 4 8
b 2 3 1
b 2 3 9
|
数据框只有一层索引,设置参数level=0
。
1
2
3
4
5
|
# 根据索引分组求和
df.groupby(level = 0 ).agg( 'sum' )
A B C
a 2 7 14
b 4 6 10
|
当数据框索引有多层时,也可以根据需求设置level参数,完成分组聚合。
1
2
3
4
|
# 数据准备
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
|
1
2
3
4
5
6
|
value
id1 id2
1 3 4
4 7
2 3 2
3 9
|
设置level
参数,如需要根据第一层索引,即id1进行分组,可以设置level=0
或level='id1'
完成分组聚合。
1
2
|
# 根据第一层索引分组求和
df.groupby(level = 0 ).agg( 'sum' )
|
1
2
3
4
|
value
id1
1 11
2 11
|
1
2
3
|
# 根据第一层索引分组求和
df.groupby(level = 'id1' ).agg( 'sum' )
|
1
2
3
4
|
value
id1
1 11
2 11
|
7、聚合
分组后一般会进行聚合操作,用agg
方法进行聚合。
1
2
3
|
# 数据准备
df = pd.DataFrame({ 'A' : [ 1 , 1 , 2 , 2 ], 'B' : [ 3 , 4 , 3 , 3 ], 'C' :[ 6 , 8 , 1 , 9 ], 'D' :[ 2 , 5 , 4 , 8 ]})
df
|
1
2
3
4
5
|
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、单函数对多列
对分组后数据框使用单个函数进行聚合,单个聚合函数会对每列进行计算,然后合并返回。聚合函数以字符串的形式传入。
1
2
|
# 对所有列分组求和
df.groupby( 'A' ).agg( 'sum' )
|
1
2
3
4
|
B C D
A
1 7 14 7
2 6 10 12
|
可以对分组后的数据指定列进行分组聚合。需要注意子列需要用[]包裹
。
1
2
|
# 对指定列分组求和
df.groupby( 'A' )[[ 'B' , 'C' ]].agg( 'sum' )
|
1
2
3
4
|
B C
A
1 7 14
2 6 10
|
聚合函数也可以传入自定义的匿名函数。
1
2
|
# 匿名函数分组求和
df.groupby( 'A' ).agg( lambda x: sum (x))
|
1
2
3
4
|
B C D
A
1 7 14 7
2 6 10 12
|
9、多函数对多列
聚合函数可以是多个函数。聚合时,多个聚合函数会对每列进行计算,然后合并返回。聚合函数以列表的形式传入。
1
2
|
# 全部列多函数聚合
df.groupby( 'A' ).agg([ 'sum' , 'mean' ])
|
1
2
3
4
5
|
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
|
聚合返回后的数据列名有两层索引,第一层是聚合的列名,第二层是使用的聚合函数名。如果需要对返回的聚合函数名重命名,
需要在传参时,传入元组,第一个元素为聚合函数名,第二个元素为聚合函数。
1
2
|
# 聚合函数重命名
df.groupby( 'A' ).agg([( 'SUM' , 'sum' ),( 'MEAN' , 'mean' )])
|
1
2
3
4
5
|
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
|
同样,也可以传入匿名函数。
1
2
|
# 匿名函数并重命名
df.groupby( 'A' ).agg([( 'SUM' , 'sum' ),( 'MAX' , lambda x: max (x))])
|
1
2
3
4
5
|
B C D
SUM MAX SUM MAX SUM MAX
A
1 7 4 14 8 7 5
2 6 3 10 9 12 8
|
如果需要对不同的列进行不同的聚合计算,则需要传入字典的形式。
1
2
|
# 不同列不同聚合函数
df.groupby( 'A' ).agg({ 'B' :[ 'sum' , 'mean' ], 'C' : 'mean' })
|
1
2
3
4
5
|
B C
sum mean mean
A
1 7 3.5 7
2 6 3.0 5
|
可以重命名聚合后的列名,注意只能对一列传入一个聚合函数时有效
。
1
2
|
# 聚合后重命名列名
df.groupby( 'A' ).agg(B_sum = ( 'B' , 'sum' ),C_mean = ( 'C' , 'mean' ))
|
1
2
3
4
|
B_sum C_mean
A
1 7 7
2 6 5
|
到此这篇关于python pandas分组聚合详细的文章就介绍到这了,更多相关python pandas分组聚合内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.jianshu.com/p/bd8d6ba29d0e