为何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é
相关产品推荐
相关产品推荐

