如果两个文件中的值匹配,则合并行-Python

时间:2018-09-25 00:15:37

标签: python merge

我有两个文件,file1看起来像这样:

#query_name KEGG_KOs
PROKKA_00019   K00240
PROKKA_00020   K00246
PROKKA_00022   K02887

文件2:

Geneid  Chr Count
PROKKA_00019    k141_1000050    102
PROKKA_00020    k141_1000050    132
PROKKA_00021    k141_1000054    36

如果file1中的'#query_name'与file2中的'Geneid'相匹配,则创建如下所示的file3:

Geneid  KEGG_KOs    Chr Count
PROKKA_00019    K00240  k141_1000050    102
PROKKA_00020    K00246  k141_1000050    132

我无法创建file3,到目前为止,我已经编写了以下内容,但未能使其正常工作。其他选项可能正在使用pandas.DataFrame.join,但我可以告诉我所需的只是一个简单的脚本。任何帮助将不胜感激,谢谢。

filenames =['file1.txt', 'file2.txt']
with open('file3.txt', 'w') as collated:
    with open('1.txt', 'r') as genes:
        with open('2.txt', 'r') as counts:
            if '#query_name' in genes == 'Geneid' in counts:
                for line1, line2 in zip(genes, counts):
                    print(line1.strip(), line2.strip(), file=collated)

1 个答案:

答案 0 :(得分:1)

这是使用熊猫的解决方案:

输入:

df1 = pd.read_csv('file1.txt', sep='\t')
df2 = pd.read_csv('file2.txt', sep='\t')
merged_df = df1.merge(df2, left_on='#query_name' , right_on='Geneid' , how='inner').drop(['#query_name'],axis=1)
merged_df.to_csv('output.csv', index=False)

merged_df的输出:

  KEGG_KOs        Geneid           Chr  Count
0   K00240  PROKKA_00019  k141_1000050    102
1   K00246  PROKKA_00020  k141_1000050    132

第2行和第3行只是读取txt文件(我假设它们是制表符分隔的),并将它们另存为pandas数据帧(df1和df2)。在第4行,我使用#query_name和Geneid列合并df1和df2,然后删除#query_name列。我将输出另存为csv,并删除了索引(0,1)。如果要将合并的数据框另存为制表符分隔的文件,则只需将最后一行更改为:merged_df.to_csv('output.txt', sep='\t', index=False)


如果遇到键盘错误,则必须表示文件的格式可能有点奇怪(空格和制表符混合在一起)。该代码应该可以工作:

输入:

import pandas as pd
def to_df(file):
    with open(file) as f:
        df = [line.strip().split() for line in f]
    return pd.DataFrame(df[1:], columns=df[0])
df1 = to_df('file1.txt')
df2 = to_df('file2.txt')
merged_df = df1.merge(df2, left_on='#query_name' , right_on='Geneid' , how='inner').drop(['#query_name'],axis=1)
merged_df.to_csv('output.csv', index=False)

输出:

  KEGG_KOs        Geneid           Chr Count
0   K00240  PROKKA_00019  k141_1000050   102
1   K00246  PROKKA_00020  k141_1000050   132