如何使用Pandas合并两个DataFrame并匹配关联kingdom字段?
如何合并两个Pandas DataFrame并补充缺失的kingdom列?
嘿,我来帮你搞定这个Pandas数据合并的需求!首先咱们先把你提供的两个原始DataFrame梳理清楚,然后一步步实现你想要的目标结果。
第一步:明确原始DataFrame结构
先把你给出的两个DataFrame用代码正确构造出来(修正了排版混乱问题,确保列与行数据对应):
第一个DataFrame(包含kingdom列)
import pandas as pd df1 = pd.DataFrame({ 'seq1_id': [45, 34, 32, 32], 'seq2_id': [56, 43, 34, 12], 'dN': [23, 34, 21, 35], 'dS': [455, 453, 90, 211], 'Dist1': [10, 15, 5, 3], 'Dist_brute': [20, 25, 8, 6], 'kingdom': ['eucaryota', 'procaryota', 'Virus', 'Virus'], 'seq1': ['seq6', 'seq3', 'seq21', 'seqXX'], 'seq2': ['seq9', 'seq98', 'seq87', 'seqYY'] })
第二个DataFrame(无kingdom列)
df2 = pd.DataFrame({ 'seq1_id': [45, 78, 32, 32, 21, 34], 'seq2_id': [56, 45, 34, 12, 23, 43], 'dN': [23, 45, 21, 35, 23, 34], 'dS': [455, 789, 90, 211, 123, 453], 'Dist1': [10, 32, 5, 3, 12, 34], 'Dist_brute': [20, 789, 8, 6, 123, 453], 'seq1': ['seq4', 'seq3', 'seq21', 'seq45', 'seq6', 'seq3'], 'seq2': ['seq12', 'seq98', 'seq87', 'seq90', 'seq9', 'seq98'] })
解决方案:使用Pandas的merge方法
核心思路是用**右连接(right join)保留第二个DataFrame的所有行,同时将第一个DataFrame中匹配行的kingdom值填充进去,不匹配的行自动填充NaN。如果需要保留两个DataFrame的所有行,换成全外连接(outer join)**即可。
完整实现代码
# 合并两个DataFrame:用seq1和seq2作为匹配键,右连接保留df2的所有行 merged_df = pd.merge(df1, df2, on=['seq1', 'seq2'], how='right', suffixes=('_df1', '_df2')) # 合并重复列:优先保留df2的数值(符合目标结果以df2行为基础的需求) for col in ['seq1_id', 'seq2_id', 'dN', 'dS', 'Dist1', 'Dist_brute']: merged_df[col] = merged_df[f'{col}_df2'].fillna(merged_df[f'{col}_df1']) merged_df.drop([f'{col}_df1', f'{col}_df2'], axis=1, inplace=True) # 调整列顺序,与目标DataFrame一致 merged_df = merged_df[['seq1_id', 'seq2_id', 'dN', 'dS', 'Dist1', 'Dist_brute', 'kingdom', 'seq1', 'seq2']] # 查看最终结果 print(merged_df)
代码逻辑解释
- 合并数据:
how='right'确保保留df2的所有行,通过on=['seq1', 'seq2']指定匹配的唯一标识列,把df1的kingdom列对应到匹配行,无匹配时kingdom自动为NaN。 - 处理重复列:合并后相同列会生成带后缀的副本,这里优先取df2的数值(符合你目标结果的行数据要求),然后删除多余的后缀列。
- 调整列顺序:将列排列成你目标DataFrame的顺序,保证输出结构完全符合预期。
内容的提问来源于stack exchange,提问作者Grendel
相关产品推荐
相关产品推荐

