如何基于月度分组计算DataFrame平均值(适配多列数据)
多列DataFrame按月计算(总和/行数)均值的实现
原始数据
import pandas as pd df = pd.DataFrame({ 'created_time': pd.to_datetime([ '2021-07-01', '2021-07-31', '2021-08-02', '2021-08-05', '2021-08-07', '2021-09-06', '2021-09-08', '2021-09-25', '2021-09-30' ]), 'shares_count': [250.0, 501.0, 48.0, 300.0, 200.0, 28.0, 100.0, 100.0, 200.0] })
需求说明
需按月分组后,对每列计算月度总和 ÷ 当月数据行数的均值,目标输出格式:
created_time shares_count 2021-07-31 375.5 2021-08-31 182.666 2021-09-30 142.66
原代码仅支持单列:
df.groupby(pd.Grouper(key='created_time',freq='M')).apply(lambda x: x['shares_count'].sum()/len(x))
适配多列的三种实现方法
方法1:直接用mean()(最简方案)
你需要的计算逻辑本质就是算术平均值,Pandas内置的groupby.mean()直接实现了这个逻辑,自动适配所有数值列:
df_monthly_avg = df.groupby(pd.Grouper(key='created_time', freq='M')).mean()
方法2:通过sum()与count()手动计算
如果需要明确展示计算过程,可以分别计算月度总和与行数后相除:
# 按月计算每列总和 df_sum = df.groupby(pd.Grouper(key='created_time', freq='M')).sum() # 按月计算每列的有效行数(无缺失值时等于当月数据行数) df_row_count = df.groupby(pd.Grouper(key='created_time', freq='M')).count() # 计算均值 df_monthly_avg = df_sum / df_row_count
方法3:用agg()自定义聚合逻辑
通过agg对所有列应用统一的聚合函数,灵活适配多列:
df_monthly_avg = df.groupby(pd.Grouper(key='created_time', freq='M')).agg( lambda col: col.sum() / len(col) )
验证结果
运行任意一种方法后,输出结果如下(保留三位小数示例):
print(df_monthly_avg.round(3)) # 输出: # shares_count # created_time # 2021-07-31 375.500 # 2021-08-31 182.667 # 2021-09-30 107.000 # 注:28+100+100+200=428,428÷4=107,原需求示例中的142.66应为笔误
内容的提问来源于stack exchange,提问作者kez
相关产品推荐
相关产品推荐

