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

Python:如何按姓名合并列名不同的多DataFrame指定列

解决方法:通过左连接匹配并清洗数据

你遇到的问题核心是未正确使用左连接+忽略了姓名字段的空白字符,导致merge结果不符合预期。以下是具体的解决步骤和代码:

步骤说明

  1. 清洗姓名字段:DF2中部分Termed_Name存在前后空格(比如" Sarah B."、" Paul M."),这会导致和DF1的Emp_Name匹配失败,必须先去除空白。
  2. 左连接匹配:以DF2为左表,只关联DF1中需要的Emp_Name和ID列,确保DF2的所有行都被保留(包括像Paul M.这种不在DF1里的记录)。
  3. 调整列顺序:按照目标结构重新排列列。

完整代码

import pandas as pd

# 模拟你的DF1和DF2数据(实际使用时替换成你的真实数据)
df1 = pd.DataFrame({
    'ID': [101, 102, 103, 104, 823],
    'Emp_Name': ['Josh A.', 'Sarah B.', 'Michael C.', 'Fred D.', 'Frank O.'],
    'Job': ['Sales Advisor', 'Sales Advisor', 'Tech Support', 'Tech Support', 'Financial Advisor'],
    'Status': ['Active', 'Termed', 'Active', 'Termed', 'Termed'],
    'Team': ['Sales', 'Sales', 'Tech', 'Tech', 'Finance']
})

df2 = pd.DataFrame({
    'Termed_Name': [' Sarah B.', 'Fred D.', '  Paul M.', 'Frank O.'],
    'Manager_Name': ['Mary S.', 'John D.', None, 'Gary H.'],
    'Manager_ID': [156, 164, None, 532]
})

# 1. 清洗姓名字段,去除前后空白
df1['Emp_Name'] = df1['Emp_Name'].str.strip()
df2['Termed_Name'] = df2['Termed_Name'].str.strip()

# 2. 左连接匹配ID
merged_df = pd.merge(
    df2,
    df1[['Emp_Name', 'ID']],  # 只取DF1中需要的列,减少计算量
    left_on='Termed_Name',
    right_on='Emp_Name',
    how='left'  # 关键:左连接保留DF2的所有行
)

# 3. 调整列顺序,删除多余的Emp_Name列
target_df = merged_df[['Manager_Name', 'Manager_ID', 'Termed_Name', 'ID']]

# 查看结果
print(target_df)

运行结果

Manager_Name  Manager_ID Termed_Name     ID
0        Mary S.       156.0    Sarah B.  102.0
1        John D.       164.0     Fred D.  104.0
2           NaN         NaN     Paul M.    NaN
3        Gary H.       532.0    Frank O.  823.0

(注:NaN对应你目标中的NA,pandas中默认用NaN表示缺失值,若需要显示为NA可以用target_df.fillna('NA')转换)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:15:34