通过pandas合并两个csv文件

uajslkp6  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(87)

这是我的第一个文件的一部分:

>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,,,,,,,,


第一个文件的顺序发生了变化,并且还有,,,,,,其中应该有第二个文件的列。如何解决这个问题?

svmlkihl

svmlkihl1#

前言

  • 因为你想通过'id'列(>NODE...)合并两个嵌套框,所以你一定要使用df.merge
  • 作为输入文件1和2,我完全使用了您提供的内容。
  • 您需要使用您提供的输入,而不是您可以使用的全部数据。这使得相互理解变得困难。
  • "第一个文件的顺序改变了":这可以通过对结果表进行排序来解决。
  • 最后,在格式化问题后快速浏览一下,并因此能够阅读它,强烈建议您的主要问题是:您没有查看与最新代码对应的 * out * 文件。* out1.csv * 和 * out2.csv * 不可能相同。

复制问题

我从复制你的newdf = df1.merge(df2, how='left', on='id')行开始。它所做的是用在相应的'id'上找到的df2中的元素完成df1,并留下df2的其余部分,因此只返回3行。这就是它产生的结果;* 请确认这是否是你要找的。*

newdf = df1.merge(df2, how='left', on='id')

                                        id  sample    bin                                 profile                                             sub id                             identity              q length      alignment length           mismatches    gap opens                                  evalue             bit score
0  >NODE_1080_length_25086_cov_1.756193_10  301022  fa_10  PF00128-Alpha-amylase-catalytic-domain                                     gb|AVX77188.1|                               67.177                   724                   719                  236            0                                     0.0                  1017
1  >NODE_84_length_160839_cov_0.924412_104  301022  fa_11  PF00128-Alpha-amylase-catalytic-domain  gb|AGX66494.1|;gb|ADS15792.1|;gb|AKW57899.1|;g...  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;
2   >NODE_793_length_32677_cov_0.985420_20  301022  fa_11  PF00128-Alpha-amylase-catalytic-domain                                                NaN                                  NaN                   NaN                   NaN                  NaN          NaN                                     NaN                   NaN

字符串
下面是一个导出的csv,使用你的newdf.to_csv('out.txt', index=False)行:

id,sample,bin,profile,sub id,identity,q length,alignment length,mismatches,gap opens,evalue,bit score
>NODE_1080_length_25086_cov_1.756193_10,301022,fa_10,PF00128-Alpha-amylase-catalytic-domain,gb|AVX77188.1|,67.177,724,719,236,0,0.0,1017
>NODE_84_length_160839_cov_0.924412_104,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,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;
>NODE_793_length_32677_cov_0.985420_20,301022,fa_11,PF00128-Alpha-amylase-catalytic-domain,,,,,,,,


最后的,,,,,,,,实际上表示NaNdf2没有关于>NODE_793的信息
这是你想要的输出吗?
您发布的 * out1.csv * 和 * out2.csv * 没有意义:

  • 两者不可能完全相同
  • 它包含一些'id',这些'id'在您发布的输入数据中不存在
  • 有重复的同一行
  • 我不知道你是怎么弄到这个文件的。
    • 建议:它看起来不像是用df2合并的结果,你可能混淆了文件,没有看到正确的csv。保存新的合并产品时,请使用不同的文件名。**

关于set_index

  • df1.set_index(['id'])创建了一个df1的视图,并设置了索引。它不会改变df1。要修改df1,请使用df1.set_index(['id'], inplace=True)
  • 然而,合并在列上工作得很好,所以你没有改变字符串是件好事。**你的代码没有它也能工作!**有关这方面的更多信息,请参阅Merge two dataframes by index

替代方案

现在,如果你想保留所有信息(合并所有行,而不是跳过任何一行),那么这就是你要找的:

df1.merge(right=df2,
          how='outer', # 'outer' means keep all rows
          on='id',
          sort=True)   # optional, added just for readability

                                        id    sample    bin                                 profile                                             sub id                             identity              q length      alignment length            mismatches     gap opens                                          evalue             bit score
0  >NODE_102_length_146227_cov_1.193242_34       NaN    NaN                                     NaN  gb|AGD14055.1|;gb|QCA67811.1|;gb|QCA68885.1|;g...  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;
1  >NODE_1045_length_25717_cov_0.952104_13       NaN    NaN                                     NaN  gb|AEI19864.1|;gb|QHZ14374.1|;gb|QFN56428.1|;g...  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;                                             NaN                   NaN
2  >NODE_1080_length_25086_cov_1.756193_10  301022.0  fa_10  PF00128-Alpha-amylase-catalytic-domain                                     gb|AVX77188.1|                               67.177                   724                   719                   236             0                                             0.0                  1017
3   >NODE_793_length_32677_cov_0.985420_20  301022.0  fa_11  PF00128-Alpha-amylase-catalytic-domain                                                NaN                                  NaN                   NaN                   NaN                   NaN           NaN                                             NaN                   NaN
4  >NODE_84_length_160839_cov_0.924412_104  301022.0  fa_11  PF00128-Alpha-amylase-catalytic-domain  gb|AGX66494.1|;gb|ADS15792.1|;gb|AKW57899.1|;g...  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;


这里的5 'id'停留,与任何相关信息,从任何两个框架。

oxalkeyp

oxalkeyp2#

第二个文件中以(“>NODE_1045_length_25717_cov_0.952104_13”)开头的行似乎比其他行的列数少。这可能是由于它在这里的显示方式('\t'作为列分隔符并不理想)。
尝试在阅读文件时显式设置列名,例如:

df2_column_names = ['id', 'sub id', 'identity', 'q length', 'alignment length', 'mismatches', 'gap opens', 'evalue', 'bit score']
df2 = pd.read_csv('file2', sep='\t', names=df2_column_names)

字符串

相关问题