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

Python:如何基于两个公共列合并两个DataFrame?

如何基于两个公共列合并两个Pandas DataFrame并得到指定格式的结果?

问题描述

我拥有两个DataFrame:df1与df2,其数据结构及内容如下:

df1:

JobId WorkOrderNo TradeName TradeMasterId TechnicianId Rating
0 10112 samsung10112 Plumbing 1074 NaN NaN
1 10112 samsung10112 Plumbing 1074 NaN NaN
2 10112 samsung10112 Plumbing 1074 1332.0 2.962963
295 10161 samsung10161 Carpenter 1090 NaN NaN
296 10161 samsung10161 Carpenter 1090 1337.0 3.724138
297 10161 samsung10161 Carpenter 1090 1296.0 3.526316
298 10161 samsung10161 Carpenter 1090 1296.0 3.526316

df2:

TechnicianId UserName TradeMasterId LateNight Weekends WeekDays
0 1296 ramzee rr 1090 True False True
1 1325 Arun Guna 1089 True True True
2 1326 Rajesh Thiru 1074 False False True
4 1336 RR RR 1068 False False True

我希望基于这两个DataFrame中的两个公共列进行合并,得到指定格式的最终数据集,请问如何实现该需求?


解决方案

没问题,这在Pandas里用merge()函数就能轻松搞定,咱们一步步来:

1. 确定合并键

两个DataFrame的公共列是TechnicianId和TradeMasterId,我们需要同时用这两个列来匹配行,确保合并的准确性(避免单一列匹配出现的错误关联)。

2. 执行合并操作

最常用的是左连接(how='left'),它会完整保留df1的所有行,同时将df2中匹配成功的对应列(比如UserName、LateNight等)合并进来,没有匹配到的行对应的df2列会自动填充NaN,完美适配你保留原始df1数据的需求:

import pandas as pd

# 基于两个公共列执行左连接合并
merged_df = pd.merge(df1, df2, on=['TechnicianId', 'TradeMasterId'], how='left')

3. 合并结果示例

针对你提供的样本数据,合并后的核心行结果如下:

JobId WorkOrderNo TradeName TradeMasterId TechnicianId Rating    UserName LateNight Weekends WeekDays
0 10112 samsung10112 Plumbing 1074 NaN NaN NaN NaN NaN NaN
2 10112 samsung10112 Plumbing 1074 1332.0 2.962963 NaN NaN NaN NaN
297 10161 samsung10161 Carpenter 1090 1296.0 3.526316 ramzee rr True False True
298 10161 samsung10161 Carpenter 1090 1296.0 3.526316 ramzee rr True False True

4. 其他连接方式可选

如果你有不同的需求,可以调整how参数:

  • how='inner':只保留两个DataFrame中同时匹配成功的行
  • how='right':保留df2的所有行,匹配不到的df1列填充NaN
  • how='outer':保留两个DataFrame的所有行,匹配不到的列统一填充NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:17:31