1. groupBy基本操作:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'],
'B': [2, 8, 1, 4, 3, 2, 5, 9],
'C': [102, 98, 107, 104, 115, 87, 92, 123]})
df
# 输出
A B C
0 a 2 102
1 b 8 98
2 a 1 107
3 c 4 104
4 a 3 115
5 c 2 87
6 b 5 92
7 c 9 123
# 按A列分组(groupby),获取其他列的均值:
df.groupby('A').mean()
# 输出
B C
A
a 2.0 108.000000
b 6.5 95.000000
c 5.0 104.666667
# 按多列进行分组(groupby)
df.groupby(['A','B']).mean()
# 输出
C
A B
a 1 107
2 102
3 115
b 5 92
8 98
c 2 87
4 104
9 123
# 分组后选择列进行运算
df = pd.DataFrame([[1, 1, 2], [1, 2, 3], [2, 3, 4]], columns=["A", "B", "C"])
df
# 输出
A B C
0 1 1 2
1 1 2 3
2 2 3 4
# 按照A列分组
g = df.groupby("A")
# 仅对B列求平均值
g['B'].mean()
# 输出
A
1 1.5
2 3.0
Name: B, dtype: float64
# 对B、C列求平均值
g[['B', 'C']].mean()
# 输出
B C
A
1 1.5 2.5
2 3.0 4.0
# 针对不同的列选用不同的聚合方法(对B列求平均值,对C列求和)
g.agg({'B':'mean', 'C':'sum'})
# 输出
B C
A
1 1.5 5
2 3.0 4
2. 分组运算后的聚合函数agg的使用
使用agg函数就可以达到针对分组后的数据使得每一列运用不同的聚合方法
df = pd.DataFrame({'A': list('XYZXYZXYZX'),
'B': [1, 2, 1, 3, 1, 2, 3, 3, 1, 2],
'C': [12, 14, 11, 12, 13, 14, 16, 12, 10, 19]})
df
# 输出
A B C
0 X 1 12
1 Y 2 14
2 Z 1 11
3 X 3 12
4 Y 1 13
5 Z 2 14
6 X 3 16
7 Y 3 12
8 Z 1 10
9 X 2 19
# 根据A列进行分组之后对B列分别求平均值,标准差
df.groupby('A')['B'].agg(['mean', np.std])
# 输出
mean standard deviation
A
X 2.250000 0.957427
Y 2.000000 1.000000
Z 1.333333 0.577350
# 针对不同的列应用多种不同的统计方法
# 根据A列分组,对B列分别求平均值和求和,对C求标准差
df.groupby('A').agg({'B':['mean', 'sum'], 'C':['count',np.std]})
# 输出
B C
mean sum count std
A
X 2.250000 9 4 3.403430
Y 2.000000 6 3 1.000000
Z 1.333333 4 3 2.081666
# 默认是以函数名称命名的,可以自定义
df.groupby(by='A').agg(
b_mean=pd.NamedAgg(column='B', aggfunc='mean'),
b_sum=pd.NamedAgg(column='B', aggfunc='sum'),
c_count=pd.NamedAgg(column='C', aggfunc='count'),
c_std=pd.NamedAgg(column='C', aggfunc='std'),
)
# 输出
B C
b_mean b_sum c_count c_std
A
X 2.250000 9 4 3.403430
Y 2.000000 6 3 1.000000
Z 1.333333 4 3 2.081666
# 通常在调用完agg函数后需要reset_index,因为pandas会默认将groupby()的列也做为index传到结果中
df.groupby('A')['B'].agg(['min', 'max'])
# 输出
min max
A
X 1 3
Y 1 3
Z 1 2
df.groupby('A').B.agg(['min', 'max']).reset_index()
# 输出
A min max
0 X 1 3
1 Y 1 3
2 Z 1 2
参考链接: