在Pandas中,groupby方法经常与agg方法结合使用,以对分组后的数据应用聚合函数。
我的写法
python">grouped = df.groupby('year')['value'].mean().reset_index()
reset_index 是为了把它转换成dataframe。中括号里的是要算聚合mean的一列。
这相当于SQL的:
SELECT year, AVG(value)
FROM df
GROUP BY year
还可以给聚合的列取名字
python">grouped = df.groupby('year').agg(avg_col = pd.NamedAgg(column="value", aggfunc="mean")).reset_index()
相当于SQL的:
SELECT year, AVG(value) AS avg_col
FROM df
GROUP BY year
groupby() 括号里可以写几个列:
python">grouped = df.groupby(['city', 'street']).agg(bank_count = pd.NamedAgg(column='bank_id', aggfunc='count'), avg_score = pd.NamedAgg(column='score', aggfunc='mean')).reset_index()
其它讲解
基本语法
grouped = df.groupby('grouping_column')
result = grouped.agg(aggregation_functions)
• df:你的DataFrame对象。
• grouping_column:用于分组的列名。
• aggregation_functions:一个或多个聚合函数,可以是Pandas内置的函数,如sum、mean、count等,也可以是自定义的函数。
示例
假设你有一个名为df的DataFrame,包含员工的部门和工资信息,你想计算每个部门的平均工资:
python">import pandas as pd
data = {'department': ['A', 'B', 'A', 'B', 'C', 'A', 'B', 'C'],'salary': [50000, 60000, 52000, 61000, 55000, 51000, 62000, 56000]
}
df = pd.DataFrame(data)# 使用groupby和agg计算每个部门的平均工资
result = df.groupby('department')['salary'].agg('mean')
print(result)
这将输出:
department
A 51400
B 60900
C 55500
Name: salary, dtype: int64
使用多个聚合函数
你可以在agg方法中传递一个函数列表,对每个分组应用多个聚合函数:
python">result = df.groupby('department')['salary'].agg(['mean', 'sum', 'count', 'max'])
print(result)
这将输出每个部门的工资的平均值、总和、计数和最大值。
使用自定义函数
你也可以在agg方法中使用自定义函数:
python">def custom_mean(x):return x.mean()result = df.groupby('department')['salary'].agg(custom_mean)
print(result)
这将计算每个部门的平均工资,和直接使用内置的mean函数效果相同。
使用多个列和多个聚合函数
python">result = df.groupby('department').agg({'salary': ['mean', 'sum', 'max'],'other_column': ['min', 'count']
})
print(result)
python">#创建df
data = {"A": [1, 1, 2, 2],
"B": [1, 2, 3, 4],
"C": [0.362838, 0.227877, 1.267767, -0.562860]}
df = pd.DataFrame(data)
df
A B C
0 1 1 0.362838
1 1 2 0.227877
2 2 3 1.267767
3 2 4 -0.562860
只按B列聚合
python">df.groupby('A').B.agg(['min', 'max'])
输出
min max
A
1 1 2
2 3 4
多个列,多个聚合函数,并重命名
python">df.groupby("A").agg(b_min=pd.NamedAgg(column="B", aggfunc="min"),c_sum=pd.NamedAgg(column="C", aggfunc="sum")
)
输出
b_min c_sum
A
1 1 0.590715
2 3 0.704907
使用lambda函数
python">df.groupby("A")[["B"]].agg(lambda x: x.astype(float).min())
B
A
1 1.0
2 3.0
python">df.groupby('A').agg({'B': ['min', 'max'], 'C': 'sum'})
B C
min max sum
A
1 1 2 0.590715
2 3 4 0.704907
pandas agg 官网:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.DataFrameGroupBy.aggregate.html