如何调试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作为有效索引项统计,导致这部分数据被遗漏。
解决步骤
修复NaN填充逻辑:放弃
inplace=True,改用重新赋值的方式确保修改生效:# 替换原fillna行,确保NaN被正确填充为'Unknown' merged_df_stage['Sale_Indicator'] = merged_df_stage['Sale_Indicator'].fillna('Unknown')移除多余的计数列填充:你已将
Count_val赋值为1,这一步不会产生NaN,可删除后续的fillna(1):merged_df_stage['Count_val'] = 1 # 以下行多余,直接删除 # merged_df_stage['Count_val'] = merged_df_stage['Count_val'].fillna(1)验证填充结果:添加代码确认NaN已被全部替换:
print("剩余NaN数量:", merged_df_stage['Sale_Indicator'].isna().sum())正常输出应为
剩余NaN数量:0。重新运行透视表代码:此时透视表的求和结果应与原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

