我有两个包含信息的文件。我需要合并/连接两个在给定列中相同的文件中的行。
档案A:
#chr #start #end #gene #0 #strand
chrM 3307 4262 MT-ND1 0 +
chrM 4470 5511 MT-ND2 0 +
chrM 12337 14148 MT-ND5 0 +
档案B:
#chr #start #end #gene #0 #strand #e_chr #e_start #e_end #e_id #0 #strand
chr1 12337 14148 MT-ND5 0 + chr1 161427010 161427243 Larp7-Chip.MACS2_peak_9704 0 .
chr1 3307 4262 MT-ND1 0 + chr1 161423805 161424053 Larp7-Chip.MACS2_peak_9703 0 .
chr1 4470 5511 MT-ND2 0 + chr1 161429385 161429489 Larp7-Chip.MACS2_peak_9705 0 .
我的结果输出应该是这样的(基本上文件B与文件A类似地排序):
#chr #start #end #gene #0 #strand #e_chr #e_start #e_end #e_id #0 #strand
chr1 3307 4262 MT-ND1 0 + chr1 161423805 161424053 Larp7-Chip.MACS2_peak_9703 0 .
chr1 4470 5511 MT-ND2 0 + chr1 161429385 161429489 Larp7-Chip.MACS2_peak_9705 0 .
chr1 12337 14148 MT-ND5 0 + chr1 161427010 161427243 Larp7-Chip.MACS2_peak_9704 0 .
我尝试使用pandas.DataFrame.merge
执行以下操作:
import pandas as pd
import numpy as np
FileA = pd.read_table("FileA.txt")
FileB = pd.read_table("FileB.txt")
results = FileA.merge(FileB, how='left', left_on='gene', right_on='gene')
results = results.dropna()
这似乎最初起作用,但有些行丢失了。文件A有19,000行,文件B有4,800行。但我的输出文件只有大约3,8k,当我预计它有4,800。我究竟做错了什么?有没有更简单的方法来做到这一点?我是python的新手。
答案 0 :(得分:1)
根据您的描述,您应该使用how='right'
或者FileB.merge(FileA, how='left', on='gene')
说明:
In [171]: a
Out[171]:
id col1 col2
0 1 a aa
1 2 b bb
2 3 c cc
3 4 d dd
4 5 e ee
In [172]: b
Out[172]:
id col1 col2
0 2 x xx
1 4 y yy
将a
中的所有行与仅与b
匹配的行合并:a.merge(b, how='left')
In [173]: a.merge(b, on='id', how='left')
Out[173]:
id col1_x col2_x col1_y col2_y
0 1 a aa NaN NaN
1 2 b bb x xx
2 3 c cc NaN NaN
3 4 d dd y yy
4 5 e ee NaN NaN
将b
中的所有行与仅与a
匹配的行合并:b.merge(a, how='left')
In [174]: b.merge(a, on='id', how='left')
Out[174]:
id col1_x col2_x col1_y col2_y
0 2 x xx b bb
1 4 y yy d dd
或:
In [175]: a.merge(b, on='id', how='right')
Out[175]:
id col1_x col2_x col1_y col2_y
0 2 b bb x xx
1 4 d dd y yy