如何用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
相关产品推荐
相关产品推荐

