如何用Pandas交叉表替换DataFrame中Age列的NaN值
用Pandas分组交叉统计填充Age缺失值的解决方案
嘿,作为Pandas新手碰到缺失值填充的问题太正常啦!我帮你用Pclass和Sex的交叉分组统计来做这个查找表,完美解决Age列的NaN填充问题,步骤超清晰:
核心思路
我们可以基于Pclass(舱位等级)和Sex(性别)的组合,计算每个分组下Age的统计值(中位数/均值),把这个结果作为填充缺失值的查找表,精准匹配到对应乘客身上。
方法一:分步实现(适合理解逻辑)
创建分组统计的查找表
先按Pclass和Sex分组,计算每组Age的中位数(比均值更稳健,不受极端值影响):# 生成每个Pclass-Sex组合的Age中位数,作为填充参考 age_lookup = df.groupby(['Pclass', 'Sex'])['Age'].median().reset_index() # 如果想要交叉表的可视化格式,可以用这个: # age_crosstab = pd.crosstab(df['Pclass'], df['Sex'], values=df['Age'], aggfunc='median')匹配查找表并填充缺失值
把查找表和原DataFrame合并,用对应分组的中位数替换Age的NaN:# 合并原数据和查找表,按Pclass、Sex匹配 df_merged = df.merge(age_lookup, on=['Pclass', 'Sex'], suffixes=('', '_fill'), how='left') # 填充NaN值 df_merged['Age'] = df_merged['Age'].fillna(df_merged['Age_fill']) # 删除临时生成的填充列 df_merged.drop('Age_fill', axis=1, inplace=True) # 最后把结果赋值回原df(或者直接用df_merged) df = df_merged
方法二:一行代码搞定(高效简洁)
用groupby + transform可以直接完成分组填充,不用手动合并表,新手也能快速上手:
# 自动按Pclass和Sex分组,用每组的中位数填充该组内的Age缺失值 df['Age'] = df.groupby(['Pclass', 'Sex'])['Age'].transform(lambda x: x.fillna(x.median()))
小提示
- 如果更倾向用均值填充,把代码里的
median()换成mean()就行; - 你可以打印
age_lookup看看每个分组的填充值,确认是否符合预期; - 这个方法的优势是精准匹配乘客的舱位和性别,比全局填充更合理哦!
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

