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

