如何基于姓名顺序不同的列合并两个Pandas DataFrame?
解决两表姓名顺序相反的合并问题
核心思路是生成统一格式的匹配键:将姓名拆分为独立部分后按字母排序,再拼接成固定格式的字符串,这样不管原姓名是名在前还是姓在前,对应人员的匹配键都会一致。
具体实现步骤
- 编写一个处理姓名的函数,将姓名拆分为单词列表、排序后重新拼接
- 为两个DataFrame添加这个统一的匹配键列
- 基于匹配键进行合并,最后可按需删除该键列
完整代码示例
import pandas as pd df1 = pd.DataFrame({'name':['Dominik Hull D', 'Lulu Castaneda', 'Zachary Pearce', 'Paul Lewis', 'Neave Potts', 'Ruth Callahan', 'Evelyn Haney W', 'Julie Mclaughlin', 'Kaleb Hardin', 'Kayleigh Little', ]}) df2 = pd.DataFrame({'name':['Mclaughlin Julie', 'Hardin Kaleb', 'Hull D Dominik', 'Castaneda Lulu', 'Callahan Ruth', 'Haney W Evelyn', 'Pearce Zachary', 'Lewis Paul', 'Potts Neave', 'Little Kayleigh', ], 'value':[0,1,2,3,4,5,6,7,8,9]}) # 定义生成匹配键的函数 def get_match_key(name): # 拆分姓名为单词列表,按字母排序后拼接 parts = sorted(name.split()) return ' '.join(parts) # 为两个DataFrame添加匹配键列 df1['match_key'] = df1['name'].apply(get_match_key) df2['match_key'] = df2['name'].apply(get_match_key) # 基于匹配键合并两表 new_df = pd.merge(df1, df2, on='match_key', how='left') # 按需保留原姓名列,删除匹配键列 new_df = new_df[['name_x', 'name_y', 'value']].rename(columns={'name_x':'df1_name', 'name_y':'df2_name'}) print(new_df)
代码说明
get_match_key函数:把姓名拆分成单词后排序,比如Dominik Hull D拆分后排序得到['D', 'Dominik', 'Hull'],拼接成D Dominik Hull;对应的Hull D Dominik处理后也是同样的字符串,确保匹配。- 合并后可以根据需求调整列名和保留的列,示例中保留了两边的原姓名和value列,方便验证匹配结果。
内容的提问来源于stack exchange,提问作者luka
相关产品推荐
相关产品推荐

