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

如何调试PivotTable求和与原DataFrame数值不符问题?

问题原因与解决方法

核心问题是你对Sale_Indicator列的NaN填充操作未实际生效,导致透视表未统计到原数据中890532条NaN对应的行,最终求和结果不一致。

问题分析

你使用merged_df_stage['Sale_Indicator'].fillna('Unknown', inplace=True)尝试填充NaN,但输出的value_counts仍显示大量NaN值,说明填充失败。这通常是因为merged_df_stage是其他DataFrame的视图而非独立副本,inplace=True无法对视图进行有效修改(可能触发SettingWithCopyWarning但未被注意)。

此外,即便设置了透视表的dropna=False,由于Sale_Indicator的NaN未被替换,部分场景下pandas不会将NaN作为有效索引项统计,导致这部分数据被遗漏。

解决步骤

  1. 修复NaN填充逻辑:放弃inplace=True,改用重新赋值的方式确保修改生效:

    # 替换原fillna行,确保NaN被正确填充为'Unknown'
    merged_df_stage['Sale_Indicator'] = merged_df_stage['Sale_Indicator'].fillna('Unknown')
    
  2. 移除多余的计数列填充:你已将Count_val赋值为1,这一步不会产生NaN,可删除后续的fillna(1):

    merged_df_stage['Count_val'] = 1
    # 以下行多余,直接删除
    # merged_df_stage['Count_val'] = merged_df_stage['Count_val'].fillna(1)
    
  3. 验证填充结果:添加代码确认NaN已被全部替换:

    print("剩余NaN数量:", merged_df_stage['Sale_Indicator'].isna().sum())
    

    正常输出应为剩余NaN数量:0。

  4. 重新运行透视表代码:此时透视表的求和结果应与原DataFrame的Count_val总和一致。

修正后的完整代码

import pandas as pd
import numpy as np

# 正确填充NaN,避免使用inplace=True
merged_df_stage['Sale_Indicator'] = merged_df_stage['Sale_Indicator'].fillna('Unknown')

# 添加计数列,无需额外fillna
merged_df_stage['Count_val'] = 1

# 计算原始计数总和
count_sum = merged_df_stage['Count_val'].sum()
print(f"Sum of Count: {count_sum}")

# 验证NaN是否已被填充
print("剩余NaN数量:", merged_df_stage['Sale_Indicator'].isna().sum())

# 查看值分布
value_counts = merged_df_stage['Sale_Indicator'].value_counts(dropna=False)
print(value_counts)

# 创建透视表
pivot_table = pd.pivot_table(merged_df_stage, 
                             values=['Count_val'], 
                             index=['Sale_Indicator'], 
                             aggfunc=np.sum, 
                             fill_value=0,
                             dropna=False)

pivot_table.reset_index(inplace=True)
pivot_table.rename(columns={'Count_val': 'Count'}, inplace=True)

# 验证透视表计数总和
count_sum_pivot = pivot_table['Count'].sum()
print(f"Sum of Pivot Count: {count_sum_pivot}")

关键说明

inplace=True在处理DataFrame视图(如切片、groupby生成的子DataFrame)时经常失效,因为视图没有独立的数据副本,修改无法同步到原数据。重新赋值的方式会强制创建新列,确保修改生效。

内容的提问来源于stack exchange,提问作者Jacques De Kock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:05:40