基于匹配值连接两个DataFrame:交易数据关联姓名需求
解决方案:关联交易数据与ID-姓名映射表
这需求太常见啦,用Pandas分分钟搞定,我给你两种方法,一种是稳妥易理解的merge关联法,另一种是更高效的字典映射法,你可以根据自己的数据规模选:
方法一:使用Pandas Merge(稳妥易理解)
先模拟一下你的数据(方便你直接跑代码测试):
import pandas as pd # 模拟交易主数据 df = pd.DataFrame({ 'First ID': [854, 321], 'Second ID': [938, 438], 'Total': [50, 30], 'Currency': ['GBP', 'EUR'] }) # 模拟ID-姓名映射表 ID_df = pd.DataFrame({ 'ID code': [321, 854, 938, 438], 'Name': ['John', 'Steve', 'Mike', 'Alice'] })
接下来分两次关联,先把First ID对应的姓名加上,再关联Second ID的姓名,最后调整列顺序:
# 第一步:关联First ID对应的姓名 df_with_first = pd.merge( df, ID_df, left_on='First ID', right_on='ID code', how='left' # 用left确保原交易数据全保留,未匹配的ID会显示NaN ).rename(columns={'Name': 'First name'}).drop('ID code', axis=1) # 第二步:关联Second ID对应的姓名 final_df = pd.merge( df_with_first, ID_df, left_on='Second ID', right_on='ID code', how='left' ).rename(columns={'Name': 'Second name'}).drop('ID code', axis=1) # 调整列顺序到你想要的结构 final_df = final_df[['First ID', 'First name', 'Second ID', 'Second name', 'Total', 'Currency']]
运行后得到的final_df就是你要的结果:
First ID First name Second ID Second name Total Currency 0 854 Steve 938 Mike 50 GBP 1 321 John 438 Alice 30 EUR
注意点:
how='left'是关键:保证原交易数据的所有行都不会丢失,如果某个ID在映射表里找不到,对应姓名会显示NaN;如果你的数据能保证所有ID都有匹配,也可以用how='inner'。- 每次关联后要删除多余的
ID code列,并重命名Name列,避免列名冲突。
方法二:使用字典映射(高效适合大数据集)
如果你的交易数据量很大,merge可能有点慢,这时候用字典映射会更高效:
# 把ID_df转换成ID:姓名的字典 id_name_dict = ID_df.set_index('ID code')['Name'].to_dict() # 直接用map方法批量映射姓名 df['First name'] = df['First ID'].map(id_name_dict) df['Second name'] = df['Second ID'].map(id_name_dict) # 调整列顺序 final_df = df[['First ID', 'First name', 'Second ID', 'Second name', 'Total', 'Currency']]
这个方法和merge的结果完全一样,但速度快很多,尤其是当数据行数超过10万的时候,差距会很明显。
额外提醒:
如果你的ID_df里有重复的ID,建议先去重:
ID_df = ID_df.drop_duplicates(subset='ID code', keep='first')
这样能避免映射时出现重复行的问题。
内容的提问来源于stack exchange,提问作者qazwsx123
相关产品推荐
相关产品推荐

