Pandas:按年龄与性别分组的众值填充relationship_status列NaN值
用分组众值填充缺失值的实现方案
嘿,这个需求用Pandas的分组+变换方法就能轻松搞定,我给你一步步拆解说明:
核心思路
我们要先找到每个(age, sex)分组下relationship_status的众值,再把对应分组里的NaN值替换成这个众值。Pandas的groupby配合transform方法能完美实现这个逻辑,不用手动做复杂的映射匹配。
最简代码实现
假设你的数据集存在名为df的DataFrame里,直接运行下面的代码就能完成填充:
# 对每个(age, sex)分组,用该组的众值填充缺失的relationship_status df['relationship_status'] = df.groupby(['age', 'sex'])['relationship_status'].transform( lambda x: x.fillna(x.mode()[0]) )
代码细节解释
groupby(['age', 'sex']):按照年龄+性别组合把数据拆分成独立小组transform:这个方法会把后续函数应用到每个分组,并且返回和原DataFrame长度一致的结果,刚好对应每一行所属分组的众值x.mode()[0]:mode()方法会返回分组的众值(如果存在多个众值,取排序后的第一个),再用fillna把分组内的NaN替换成这个值
直观替代方案(先预计算众值再映射)
如果你想先明确查看每个分组的众值,也可以先生成分组-众值的映射表,再做填充:
# 先计算每个(age, sex)分组的众值 group_mode = df.groupby(['age', 'sex'])['relationship_status'].agg(lambda x: x.mode()[0]) # 把分组索引转为列,方便和原数据匹配 group_mode = group_mode.reset_index(name='mode_status') # 合并原数据和众值表,填充缺失值 df = df.merge(group_mode, on=['age', 'sex'], how='left') df['relationship_status'] = df['relationship_status'].fillna(df['mode_status']) # 清理临时生成的辅助列 df = df.drop('mode_status', axis=1)
这个方案更适合需要验证分组众值正确性的场景。
边界情况处理
如果某个(age, sex)分组的relationship_status全是NaN,x.mode()[0]会触发报错,这种情况可以提前设置默认值兜底:
df['relationship_status'] = df.groupby(['age', 'sex'])['relationship_status'].transform( lambda x: x.fillna(x.mode()[0] if not x.mode().empty else 'Single') )
内容的提问来源于stack exchange,提问作者WBraszkiewicz
相关产品推荐
相关产品推荐

