这是我的第一个文件的一部分:
>NODE_1080_length_25086_cov_1.756193_10 301022 fa_10 PF00128-Alpha-amylase-catalytic-domain
>NODE_84_length_160839_cov_0.924412_104 301022 fa_11 PF00128-Alpha-amylase-catalytic-domain
>NODE_793_length_32677_cov_0.985420_20 301022 fa_11 PF00128-Alpha-amylase-catalytic-domain
字符串
这是我的第二个文件的一部分:
>NODE_1080_length_25086_cov_1.756193_10 gb|AVX77188.1| 67.177 724 719 236 0 0.0 1017
>NODE_102_length_146227_cov_1.193242_34 gb|AGD14055.1|;gb|QCA67811.1|;gb|QCA68885.1|;gb|QCA71791.1|;gb|AUF68592.1|; 49.512;40.618;40.047;41.734;38.038; 454;454;454;454;454; 410;421;422;369;418; 207;221;224;199;231; 0;10;10;8;8; 3.71e-159;1.64e-77;7.99e-76;4.89e-74;6.11e-70; 461;252;248;243;232;
>NODE_1045_length_25717_cov_0.952104_13 gb|AEI19864.1|;gb|QHZ14374.1|;gb|QFN56428.1|;gb|AYH98249.1|;gb|AYH98253.1|; 56.442;53.420;53.420;53.420;53.094; 372;372;372;372;372; 326;307;307;307;307; 140;142;142;142;143; 1;1;1;1;1;
>NODE_84_length_160839_cov_0.924412_104 gb|AGX66494.1|;gb|ADS15792.1|;gb|AKW57899.1|;gb|ACH26137.1|;gb|AGX66492.1|; 85.078;54.852;45.781;44.040;43.114; 518;518;518;518;518; 516;474;474;495;501; 77;204;231;246;258; 0;4;9;11;9; 0.0;0.0;1.47e-139;5.50e-138;1.69e-137; 928;557;416;413;411;
型
我需要按“id”合并这些文件。
df1 = pd.read_csv('file1', sep='\t')
df2 = pd.read_csv('file2', sep='\t')
df1.columns = ['id', 'sample', 'bin', 'profile']
df2.columns = ['id', 'sub id', 'identity', 'q length', 'alignment length', 'mismatches', 'gap opens', 'evalue', 'bit score']
print(df1.head(3))
id sample bin profile
0 >NODE_1080_length_25086_cov_1.756193_10 301022 fa_10 PF00128-Alpha-amylase-catalytic-domain
1 >NODE_84_length_160839_cov_0.924412_104 301022 fa_11 PF00128-Alpha-amylase-catalytic-domain
2 >NODE_793_length_32677_cov_0.985420_20 301022 fa_11 PF00128-Alpha-amylase-catalytic-domain
print(df2.head(3))
id sub id ... evalue bit score
0 >NODE_1080_length_25086_cov_1.756193_10 gb|AVX77188.1| ... 0.0 1017.0
1 >NODE_102_length_146227_cov_1.193242_34 gb|AGD... NaN ... NaN NaN
2 >NODE_1045_length_25717_cov_0.952104_13 gb|AEI... NaN
型
我尝试了这两种方法:
# **First way**
df1.set_index(['id'])
df2.set_index(['id'])
newdf = df1.merge(df2, how='left', on='id')
newdf.to_csv('out.txt', index=False)
# **Second way**
df1[['sub id', 'identity', 'q length', 'alignment length', 'mismatches', 'gap opens', 'evalue', 'bit score']] = df2[['sub id', 'identity', 'q length', 'alignment length', 'mismatches', 'gap opens', 'evalue', 'bit score']]
df1.to_csv('out2.txt', index=False)
型
结果out.txt和out2.txt是相同的:
>NODE_84_length_160839_cov_0.924412_104,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
>NODE_793_length_32677_cov_0.985420_20,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
>NODE_84_length_160839_cov_0.924412_102,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
>NODE_60_length_195775_cov_1.016241_138,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
>NODE_231_length_89097_cov_0.976280_72,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
>NODE_9565_length_2974_cov_0.963826_2,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
>NODE_48_length_222468_cov_1.632467_203,301022,fa_12,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,
型
第一个文件的顺序发生了变化,并且还有,,,,,
,其中应该有第二个文件的列。如何解决这个问题?
2条答案
按热度按时间svmlkihl1#
前言
'id'
列(>NODE...
)合并两个嵌套框,所以你一定要使用df.merge
。复制问题
我从复制你的
newdf = df1.merge(df2, how='left', on='id')
行开始。它所做的是用在相应的'id'
上找到的df2
中的元素完成df1
,并留下df2
的其余部分,因此只返回3行。这就是它产生的结果;* 请确认这是否是你要找的。*字符串
下面是一个导出的csv,使用你的
newdf.to_csv('out.txt', index=False)
行:型
最后的
,,,,,,,,
实际上表示NaN
:df2
没有关于>NODE_793
的信息这是你想要的输出吗?
您发布的 * out1.csv * 和 * out2.csv * 没有意义:
关于
set_index
df1.set_index(['id'])
创建了一个df1的视图,并设置了索引。它不会改变df1。要修改df1,请使用df1.set_index(['id'], inplace=True)
。替代方案
现在,如果你想保留所有信息(合并所有行,而不是跳过任何一行),那么这就是你要找的:
型
这里的5
'id'
停留,与任何相关信息,从任何两个框架。oxalkeyp2#
第二个文件中以(“>NODE_1045_length_25717_cov_0.952104_13”)开头的行似乎比其他行的列数少。这可能是由于它在这里的显示方式('\t'作为列分隔符并不理想)。
尝试在阅读文件时显式设置列名,例如:
字符串