2016-04-25 37 views
0

私は情報を持つ2つのファイルを持っています。私はマージする必要があります/与えられた列内の同一の両方のファイルから行を結合します。パンダの2つのファイルをマージする

ファイル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 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 . 

#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ファイルと同様にソートされたファイル)のようになります。 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行があります。しかし、私の出力ファイルは約4,800を持っていると思いますが、約3,8kしかありません。私は間違って何をしていますか?これを行う簡単な方法はありますか?私はPythonの初心者です。あなたの説明に続いて

+1

これはあなたのファイルで '遺伝子' 内の実際の値に依存します。私は、ファイルを数行(例えばそれぞれ20個)に減らし、もう一度見てみることをお勧めします。問題が解決しない場合は、データを転記してください。 – tfv

+0

私はTeamtreehouseでPythonコースを終えました。構文は問題ではありません。私の仕事には、タブで区切られたファイル処理がたくさん含まれています。これは通常Rで行います。私はPandasを使って同じことをPythonでやろうとしています。問題ありますか? @tfv私はそれにショットを与えます – System

+0

あなたは '.dropna()'でいくつのrecsをドロップしていますか?私はそこから始めるだろう。 – 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 

bから一致するもののみでaからすべての行をマージ: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 
関連する問題