合并pandas中的两个文件

时间:2016-04-25 19:07:04

标签: python pandas

我有两个包含信息的文件。我需要合并/连接两个在给定列中相同的文件中的行。

档案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的新手。

1 个答案:

答案 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