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

如何在Pandas中基于多列匹配同表记录填充缺失值?

解决方法

你的代码问题在于:当分组内没有非缺失的Column ID时,ffill+bfill无法完成有效填充,会导致该组所有Column ID变为nan;另外如果分组内存在多个不同的非缺失值(即便你的需求是同组值一致,若数据存在异常),这种顺序填充方式也不符合预期。

下面是两种更可靠的实现方式:

方法1:利用transform取组内非缺失值填充

如果同一分组(Column 1至Column 5取值相同)的Column ID非缺失值均为同一个,直接取组内第一个非缺失值填充整个组的缺失项:

df['Column ID'] = df.groupby(['Column 1','Column 2','Column 3','Column 4','Column 5'])['Column ID'].transform(
    lambda x: x.fillna(x.dropna().iloc[0]) if not x.dropna().empty else x
)
  • 逻辑:对每个分组先判断是否存在非缺失值,有则用第一个非缺失值填充所有缺失项;无则保留原nan。

方法2:构建映射表后用map填充

先聚合得到每个唯一分组对应的Column ID,再通过映射关系填充缺失值:

# 构建分组到非缺失Column ID的映射(去重确保每组仅保留一个有效ID)
group_id_map = df.dropna(subset=['Column ID']).drop_duplicates(
    subset=['Column 1','Column 2','Column 3','Column 4','Column 5']
).set_index(['Column 1','Column 2','Column 3','Column 4','Column 5'])['Column ID']

# 逐行匹配映射表填充缺失值
df['Column ID'] = df.apply(
    lambda row: group_id_map.get((row['Column 1'], row['Column 2'], row['Column 3'], row['Column 4'], row['Column 5']), row['Column ID']),
    axis=1
)
  • 逻辑:先提取有有效Column ID的分组映射关系,再对每一行判断:若Column ID缺失则从映射表取对应值,否则保留原值。

原代码问题补充说明

你的代码中fill_map变量未被使用,属于冗余代码;而ffill+bfill的组合仅在组内非缺失值分布在首尾位置时有效,若组内仅中间有值或全缺失,就会出现填充失败甚至导致有效值丢失的情况。


内容的提问来源于stack exchange,提问作者Hari Shreyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:20:00