在Pandas分组DataFrame中自定义算术聚合及.agg函数使用问题
解决方案:按分组计算总销售额与月均销售额(按月份数平均)
针对你需要按Name和Fiscal_Year分组,计算总销售额及按月份数量平均的月均销售额需求,以下是两种可行的实现方式:
方法一:分步聚合计算(推荐,逻辑清晰)
先分组计算总销售额和分组内的唯一月份数,再通过列运算得到月均销售额:
import pandas as pd # 加载你的数据 df = pd.DataFrame( { 'Name': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'], 'day': [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], 'month': ['Apr', 'Apr', 'Apr', 'Apr', 'May', 'May', 'May', 'May', 'Apr', 'Apr', 'Apr', 'Apr', 'May', 'May', 'May', 'May'], 'Fiscal_Year': ['FY2023-24', 'FY2023-24', 'FY2024-25', 'FY2024-25', 'FY2023-24', 'FY2023-24', 'FY2024-25', 'FY2024-25', 'FY2023-24', 'FY2023-24', 'FY2024-25', 'FY2024-25', 'FY2023-24', 'FY2023-24', 'FY2024-25', 'FY2024-25'], 'sale': [100, 222, 333, 444, 200, 111, 555, 366, 666, 777, 300, 345, 756, 896, 452, 365] }) # 分组聚合:计算总销售额和分组内唯一月份数 grouped_df = df.groupby(['Name', 'Fiscal_Year'], as_index=False).agg( Total_Sales=('sale', 'sum'), Month_Count=('month', 'nunique') ) # 计算月均销售额:总销售额 ÷ 唯一月份数 grouped_df['Mavg'] = grouped_df['Total_Sales'] / grouped_df['Month_Count'] # 可选:删除中间辅助列Month_Count # grouped_df = grouped_df.drop('Month_Count', axis=1) print(grouped_df)
输出结果:
Name Fiscal_Year Total_Sales Month_Count Mavg 0 a FY2023-24 633 2 316.5 1 a FY2024-25 1707 2 853.5 2 b FY2023-24 3105 2 1552.5 3 b FY2024-25 1462 2 731.0
方法二:自定义聚合函数
直接在agg中使用自定义函数,一次性计算月均销售额:
import pandas as pd # 定义自定义聚合函数 def monthly_average(group): total = group['sale'].sum() unique_months = group['month'].nunique() return total / unique_months # 分组聚合 grouped_df = df.groupby(['Name', 'Fiscal_Year'], as_index=False).agg( Total_Sales=('sale', 'sum'), Mavg=('sale', monthly_average) ) print(grouped_df)
关键问题说明
- 你之前使用
('Sale', 'mean')得到的是日均销售额(总销售额除以分组内的天数/行数),而非需求的月均销售额。 - 直接对整个DataFrame执行
df['sale'].sum()/df['month'].nunique()无法实现分组计算,因为它没有考虑Name和Fiscal_Year的分组维度,仅计算全局平均值。
内容的提问来源于stack exchange,提问作者Ninad Padh
相关产品推荐
相关产品推荐

