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

如何基于公共列匹配用另一pandas DataFrame数值替换当前DataFrame的NaN值

解决方案

方法1:无需提前提取df3,直接全表匹配填充(推荐)

这种方法逻辑简单,不会出现索引错位问题,只会覆盖df1中的NaN值,不会修改原有有效值:

# 1. 将两个表的匹配公共列设为索引
df2_match = df2.set_index(['types', 'o_periods'])
df1.set_index(['types', 'o_periods'], inplace=True)

# 2. 用df2的数值填充df1的空值,overwrite=False表示不覆盖已有有效值
df1.update(df2_match, overwrite=False)

# 3. 恢复df1的原有结构
df1.reset_index(inplace=True)

说明:update方法会自动基于索引匹配对应行,仅对df1中的NaN位置赋值,完全符合需求。

方法2:基于已提取的df3填充,解决索引丢失问题

如果你已经提前拆分出了df3,只需要在合并时保留df3的原始行索引即可:

# 1. 把df3的原始索引存为普通列,避免merge时丢失
df3 = df3.reset_index(names='origin_idx')

# 2. 关联df2获取对应填充值,后缀区分旧的空值列和新的填充列
df3_filled = df3.merge(
    df2,
    on=['types', 'o_periods'],
    how='left',
    suffixes=('_drop', '')
)
# 只保留需要的列
df3_filled = df3_filled[['origin_idx', 'types', 'c_years', 'o_periods', 's_months', 'incidents']]

# 3. 把原始索引恢复为行索引,更新到df1对应位置
df3_filled = df3_filled.set_index('origin_idx')
df1.update(df3_filled)

说明:之前遇到索引重置问题,是因为merge操作默认会生成新的连续整数索引,丢失了df3原本对应df1的行位置,提前存下原始索引再恢复即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:51:02