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

为何Pandas中groupby与pivot_table计算mean的结果不一致?

问题原因排查

两种方法的计算逻辑存在本质差异,核心是前置聚合规则和加权逻辑不同:

1. 隐含的前置聚合差异

pd.pivot_table不指定aggfunc参数时,默认会用aggfunc='mean'对「同一日期+同一市镇」的多条记录先做一次聚合:先算出该市镇当天的平均值,再填入透视表对应单元格。
而方法1没有这层前置聚合,会把当天所有单条记录直接纳入均值计算,不会按市镇分组提前合并。

2. 加权规则不一致

当存在同一日期同一个市镇有多条上报记录的情况时,两种方法的加权逻辑完全不同:

  • 方法1:每条记录权重相同,均值 = 当天所有Total_reported总和 / 当天总记录条数
  • 方法2:每个市镇权重相同,均值 = 当天所有市镇的单市镇均值总和 / 当天有上报记录的市镇数量
    举个简单示例就能看出差异:

假设2020-01-01当天有3条记录:

  • A市2条上报值:0、10
  • B市1条上报值:4
    方法1计算结果:(0+10+4)/3 ≈4.67
    方法2计算结果:((0+10)/2 + 4)/2 = 4.5

验证方案

你可以先对原始数据做聚合,确保「日期+市镇」组合唯一,再跑两种方法结果就会完全一致:

# 先按日期+市镇聚合,确保每个组合只有一条记录
df_unique = df.groupby([df.index, 'Municipality_name'])['Total_reported'].mean().reset_index(level=1)
# 方法1计算
res1 = df_unique.Total_reported.groupby(df_unique.index).mean()
# 方法2计算
df_pivot = pd.pivot_table(
    df_unique.reset_index(), 
    values='Total_reported', 
    index='Date_of_publication', 
    columns='Municipality_name'
)
res2 = df_pivot.mean(axis=1)
# 比较结果
print(res1.equals(res2)) # 输出为True

内容的提问来源于stack exchange,提问作者René

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:24:08