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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:34