Python:如何按姓名合并列名不同的多DataFrame指定列
解决方法:通过左连接匹配并清洗数据
你遇到的问题核心是未正确使用左连接+忽略了姓名字段的空白字符,导致merge结果不符合预期。以下是具体的解决步骤和代码:
步骤说明
- 清洗姓名字段:DF2中部分
Termed_Name存在前后空格(比如" Sarah B."、" Paul M."),这会导致和DF1的Emp_Name匹配失败,必须先去除空白。 - 左连接匹配:以DF2为左表,只关联DF1中需要的
Emp_Name和ID列,确保DF2的所有行都被保留(包括像Paul M.这种不在DF1里的记录)。 - 调整列顺序:按照目标结构重新排列列。
完整代码
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
相关产品推荐
相关产品推荐

