You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于月度分组计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:45:40