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

基于另一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

问题分析

  1. Inner Join的局限性:使用how='inner'仅保留两个DataFrame完全匹配的行,df2中Client 3的行因在df1中无匹配项,无法进入merged_df,导致该行未被处理。
  2. 列名不一致: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:12:37