使用Pandas透视表计算Titanic数据集who='child'缺失值时ALL行未正确汇总的问题排查
Pandas透视表计算Titanic数据集who='child'缺失值时ALL行未正确汇总的问题排查
我来帮你排查这个透视表的问题哈~ 你现在是在处理Titanic数据集的titanic.csv,目标是用透视表统计who列取值为child时的缺失值,按性别分组后让ALL行正确汇总各性别的缺失值总和对吧?
先看你写的这段代码:
pd.pivot_table(df[df['who'] == 'child'], index='sex', aggfunc=lambda x: x.isnull().sum(), margins=True) # to sum all missing values based on gender
问题出在哪?
核心有两个可能的原因:
- 透视表
margins的逻辑和你的aggfunc不匹配:
当你用margins=True时,Pandas会对整个筛选后的数据集(也就是所有who='child'的行)直接应用你写的aggfunc,而不是把男、女两组的缺失值结果相加。 - 存在
sex列缺失的child行:
如果你筛选出的child行里,有部分行的sex值是缺失的,这些行不会被分到male或female的分组里,但会被包含在ALL行的统计中——这就会导致ALL行的缺失数不等于男+女的缺失数之和,这也是你当前输出异常的大概率原因。
怎么修正?给你两个实用方案
方案一:先清理缺失的sex行,再用透视表
先把sex为空的child行排除,确保分组能覆盖所有有效行,这样ALL行的统计结果就会和分组总和一致:
# 先筛选出who=child且sex不为空的子集 child_df = df[(df['who'] == 'child') & df['sex'].notna()] # 再做透视表 pd.pivot_table(child_df, index='sex', aggfunc=lambda x: x.isnull().sum(), margins=True, margins_name='ALL')
方案二:先计算缺失值标记,再分组求和(更直观)
如果觉得透视表的margins逻辑绕,我们可以换个思路:先标记所有缺失值,再按性别分组求和,最后手动添加ALL行,完全掌控汇总逻辑:
# 筛选有效child行 child_df = df[(df['who'] == 'child') & df['sex'].notna()] # 先对每一行的所有列标记是否缺失,再按sex分组统计总数 missing_counts = child_df.isnull().groupby(child_df['sex']).sum() # 手动添加ALL行,直接求和分组结果 missing_counts.loc['ALL'] = missing_counts.sum(axis=0) print(missing_counts)
快速验证问题根源
你可以先跑这段代码看看child行里的sex缺失情况,就能确认是不是这个问题:
child_df = df[df['who'] == 'child'] print("child行中sex缺失的数量:", child_df['sex'].isnull().sum())
如果输出大于0,那就是这些缺失的sex行导致了ALL行和分组总和不匹配~
备注:内容来源于stack exchange,提问作者Anisa B.
相关产品推荐
相关产品推荐

