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

如何用Pandas从另一DataFrame按匹配规则填充缺失值?

问题描述

有两个DataFrame:
df1(var1/var2/var3为float64类型分类列,取值范围1-5,存在部分缺失值):

col1 var1 var2 var3
X11  1.0  2.0  NaN
X12  3.0  NaN  4.0
X13  NaN  5.0  2.0

df2(col4为无实际作用的拼接列):

col1 col2   val col4
X11  var1   3   X11-X21
X12  var3   2   X21-X22
X13  var2   1   X13-X32

需求:根据df2中col1(匹配df1的col1)和col2(匹配df1的列名)的对应关系,用df2的val填充df1对应位置的缺失值。


解决方案

方法1:精准定位填充

遍历df2的每一行,仅填充df1中对应位置的缺失值:

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'col1': ['X11', 'X12', 'X13'],
    'var1': [1.0, 3.0, None],
    'var2': [2.0, None, 5.0],
    'var3': [None, 4.0, 2.0]
})

df2 = pd.DataFrame({
    'col1': ['X11', 'X12', 'X13'],
    'col2': ['var1', 'var3', 'var2'],
    'val': [3, 2, 1],
    'col4': ['X11-X21', 'X21-X22', 'X13-X32']
})

# 逐行匹配填充
for _, row in df2.iterrows():
    target_row_mask = df1['col1'] == row['col1']
    target_col = row['col2']
    # 仅当目标位置为缺失时执行填充
    if pd.isna(df1.loc[target_row_mask, target_col].iloc[0]):
        df1.loc[target_row_mask, target_col] = row['val']

方法2:批量填充(更简洁)

先将df2转换为与df1结构匹配的宽表,再利用combine_first自动填充缺失值:

# 将df2转为宽表:col1作为索引,col2作为列,val为对应值
df2_wide = df2.pivot(index='col1', columns='col2', values='val')

# 以col1为索引对齐,用df2_wide填充df1的缺失值(仅填充缺失位置,保留原有有效值)
df1 = df1.set_index('col1').combine_first(df2_wide).reset_index()

两种方法均遵循需求:仅填充df1中缺失的位置,不会覆盖已有有效值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:25:32