2016-04-25 79 views
0

我有兩個文件的信息。我需要合併/連接兩個文件中給定列中相同的行。合併兩個文件中的熊貓

文件:

#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排序類似文件):

#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

這將取決於在你的文件 '基因' 的實際值。我建議你將這些文件分成幾行(每個20個),然後再看一遍。如果問題仍未解決,請發佈數據。 – tfv

+0

我已經完成了Teamtreehouse的Python課程。語法不是問題。我的工作涉及大量的製表符分隔的文件處理,我通常在R中進行。我正在嘗試使用Pandas在Python中執行相同的操作。那是問題嗎? @tfv我給一個鏡頭 – System

+0

多少區域經濟共同體,你通過'.dropna()'掉線?我會從那裏開始。 – siegerts

回答

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