如何使用Pandas基于多列站点ID合并两个DataFrame?
Pandas 数据合并问题解决方法
你需要分两次将df2与df1合并,分别匹配sites1和sites2,并对合并后的列重命名,才能得到预期的结果表。
步骤说明
- 第一次合并:将
df2和df1按sites1与sites匹配,提取sites1对应的nb samples,并重命名列 - 第二次合并:基于第一次的结果,再与
df1按sites2与sites匹配,提取sites2对应的nb samples,重命名列 - 清理多余的中间列
完整代码示例
import pandas as pd # 示例数据集(替换成你的真实数据即可) df1 = pd.DataFrame({ 'sites': ['A', 'B', 'C'], 'nb samples': [10, 20, 30] }) df2 = pd.DataFrame({ 'sites1': ['A', 'B', 'A'], 'sites2': ['B', 'C', 'C'], 'nb links': [5, 8, 6] }) # 第一次合并:匹配sites1,重命名对应列 merged_step1 = pd.merge(df2, df1, left_on='sites1', right_on='sites', how='left') merged_step1 = merged_step1.rename(columns={'nb samples': 'nb samples sites1'}).drop('sites', axis=1) # 第二次合并:匹配sites2,重命名对应列 final_result = pd.merge(merged_step1, df1, left_on='sites2', right_on='sites', how='left') final_result = final_result.rename(columns={'nb samples': 'nb samples sites2'}).drop('sites', axis=1) print(final_result)
输出结果
sites1 sites2 nb links nb samples sites1 nb samples sites2 0 A B 5 10 20 1 B C 8 20 30 2 A C 6 10 30
说明:how='left'参数确保保留df2中的所有行,若只需要保留df1中存在匹配项的行,可以将其改为how='inner'。
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

