合并两个DataFrame,无匹配项时填充NaN
用Pandas实现DataFrame左连接合并
这其实是个典型的**左连接(left join)**场景,用Pandas的merge()函数就能轻松实现你的需求——保留第一个DataFrame的所有行,同时把第二个DataFrame中匹配的分类信息tax_inf对应过来,没有匹配的位置自动填充NaN。具体步骤如下:
步骤1:构造示例数据(如果你的数据已经存在,这步可以跳过)
先把你给出的两个DataFrame用Pandas构造出来:
import pandas as pd # 第一个DataFrame df1 = pd.DataFrame({ 'qseqid': ['seq1', 'seq2', 'seq3', 'seq4'], 'sseqid': ['seq24', 'seq12', 'seq34', 'seq90'], 'pident': [78, 73, 12, 70], 'length': [789, 790, 77, 790], 'mismatch': [45, 44, 42, 41] }) # 第二个DataFrame df2 = pd.DataFrame({ 'seq2_id': ['seq3', 'seq1'], 'tax_inf': ['Virus', 'Eucaryote'] })
步骤2:执行左连接合并
使用pd.merge()函数,指定左连接模式,同时明确两个DataFrame的匹配键(第一个的qseqid和第二个的seq2_id):
# 执行左连接,匹配键分别为df1的qseqid和df2的seq2_id merged_df = pd.merge(df1, df2, left_on='qseqid', right_on='seq2_id', how='left') # 移除合并后多余的seq2_id列(因为你的目标输出里不需要这一列) merged_df = merged_df.drop(columns='seq2_id')
最终结果
运行上面的代码后,merged_df就会完全符合你想要的格式:
qseqid sseqid pident length mismatch tax_inf 0 seq1 seq24 78 789 45 Eucaryote 1 seq2 seq12 73 790 44 NaN 2 seq3 seq34 12 77 42 Virus 3 seq4 seq90 70 790 41 NaN
关键参数说明
how='left':表示以左表(也就是df1)为基准,保留所有行,右表(df2)中没有匹配的行就用NaN填充。left_on='qseqid'和right_on='seq2_id':指定两个表用来匹配的列,因为这两列的列名不同,所以需要分别指定。如果列名相同的话,直接用on='列名'就可以了。
内容的提问来源于stack exchange,提问作者Grendel
相关产品推荐
相关产品推荐

