python - 如果两个文件中的值匹配,则合并行 - Python
问题描述
我有两个文件,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)
解决方案
这是使用熊猫的解决方案:
输入:
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)
merge_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
推荐阅读
- c++ - C++ GetProcessTimes() 不会随时间改变值
- ios - Swift:为一个控制器启用横向,其余为纵向
- shell - 如何在带有别名的bashrc中使用后台执行?
- python - Python/Django 递归模型到树结构字典中
- firebase - 如何在不更改 Firebase 身份验证中的 UID 的情况下更改用户的登录方法?
- javascript - 如何将一个url的值作为Angular中的参数传递给另一个url
- elasticsearch - 从 h2o 导入 Opendsitro JDBC 索引表
- angular - 使用 Angular 在 ionic 4 中关闭应用程序的正确方法是什么?
- r - 带有详细边界的Choropleth地图
- javascript - 在 WordPress 中,如何为小屏幕提供不同的图像源?