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

Pandas Pivot_Table中Margins=True计算结果异常的原因咨询

问题:pivot_table中margins=True生成的All行均值不符合预期
# Print the mean weekly_sales by department and type; fill missing values with 0s; sum all rows and cols
print(sales.pivot_table(values="weekly_sales", index="department", columns="type", fill_value=0,margins=True))

运行结果:

type                A           B        All
department                                  
1           30961.725   44050.627  32052.467
2           67600.159  112958.527  71380.023
3           17160.003   30580.655  18278.391
4           44285.399   51219.654  44863.254
5           34821.011   63236.875  37189.000
...               ...         ...        ...
96          21367.043    9528.538  20337.608
97          28471.267    5828.873  26584.401
98          12875.423     217.428  11820.590
99            379.124       0.000    379.124
All         23674.667   25696.678  23843.950

发现margins=True生成的All行均值不符合预期,请问该异常的原因是什么?


原因分析

核心问题出在fill_value=0和margins=True的执行顺序上:

  • pandas的pivot_table会先执行fill_value填充缺失值,再计算边际统计(margins)
  • 而pivot_table默认的聚合函数是mean,那些原本没有数据的单元格(比如department 99的type B)被填充为0后,会被当作有效数据参与整体均值计算,但实际上这些缺失值代表该类别无销售记录,应该被忽略,这就导致最终All行的均值被错误拉低,不符合预期的真实统计结果。

解决方法

如果要在显示时保留0填充,同时得到正确的边际均值,需要拆分操作:先计算带margins的透视表,再填充缺失值:

# 先计算透视表(不提前填充0)
pt = sales.pivot_table(values="weekly_sales", index="department", columns="type", margins=True)
# 再填充显示用的0
pt = pt.fillna(0)
print(pt)

这样边际统计会基于原始的非缺失值计算,之后的填充仅影响显示,不会干扰统计逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:51:07