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

使用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

问题出在哪?

核心有两个可能的原因:

  1. 透视表margins的逻辑和你的aggfunc不匹配:
    当你用margins=True时,Pandas会对整个筛选后的数据集(也就是所有who='child'的行)直接应用你写的aggfunc,而不是把男、女两组的缺失值结果相加。
  2. 存在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:58:08