基于另一DataFrame两列匹配填充df2中Session name空值问题求助
匹配不同列名的DataFrame并填充空值
数据准备
import pandas as pd import numpy as np df1 = pd.DataFrame({'Date':['7/03/2022', '9/3/2022'], 'Client':['Client 1','Client 2'], 'Course 2':['Computer skill','CCC']}) df2 = pd.DataFrame({'Session Date':['7/03/2022', '9/3/2022'], 'Org':['Client 1','Client 3'], 'Session name':[np.nan,'CCC']})
需求
当df1.Date与df2.Session Date、df1.Client与df2.Org同时匹配时,用df1['Course 2']填充df2['Session name']中的空值。
问题代码及异常输出
尝试的代码:
merged_df = pd.merge(df1, df2, left_on=['Date', 'Client'], right_on=['Session Date', 'Org'], how='inner') df2['Session Name'] = merged_df.apply(lambda x: x['Course 2'] if pd.isna(x['Session Name']) else x['Session Name'], axis=1) df2
当前输出:
Session Date Org Session Name 0 7/03/2022 Client 1 Computer skill 1 9/3/2022 Client 3 NaN
期望输出:
Session Date Org Session name 0 7/03/2022 Client 1 Computer skill 1 9/3/2022 Client 3 CCC
问题分析
- Inner Join的局限性:使用
how='inner'仅保留两个DataFrame完全匹配的行,df2中Client 3的行因在df1中无匹配项,无法进入merged_df,导致该行未被处理。 - 列名不一致:df2原列名为
Session name,但代码中误用Session Name(大小写差异),会创建新列而非修改原列,同时原列的非空值也被错误覆盖。
解决方案
方法一:左连接后填充空值
通过左连接保留df2全部行,再用fillna匹配填充:
# 左连接,保留df2所有行并关联匹配的df1数据 merged = df2.merge(df1, left_on=['Session Date', 'Org'], right_on=['Date', 'Client'], how='left') # 填充空值:Session name为空时用Course 2的值,否则保留原数据 merged['Session name'] = merged['Session name'].fillna(merged['Course 2']) # 还原df2原有列结构 df2 = merged[['Session Date', 'Org', 'Session name']] print(df2)
方法二:用匹配字典映射填充
先构建匹配关系字典,再逐行判断填充:
# 构建(日期, 客户)到Course 2的映射字典 match_map = df1.set_index(['Date', 'Client'])['Course 2'].to_dict() # 遍历df2,匹配时填充空值 df2['Session name'] = df2.apply( lambda row: match_map.get((row['Session Date'], row['Org']), row['Session name']) if pd.isna(row['Session name']) else row['Session name'], axis=1 ) print(df2)
两种方法均可得到期望输出:
Session Date Org Session name 0 7/03/2022 Client 1 Computer skill 1 9/3/2022 Client 3 CCC
内容的提问来源于stack exchange,提问作者hyeri
相关产品推荐
相关产品推荐

