2015-10-23 43 views
0

我有兩個文件,一個是這樣的,打印出的文件,如果兩個文件列匹配

chrom start end ref alt alt_freq_CR alt_freq_ID gene gene_type 
chr10 28814618 28814618 T C 0 0.4167 AAA sense 
chr10 32557818 32557818 C T 0 0.1579 BBB PC 
chr10 119245101 119245101 T C 0 0.1667 ZZZ rega 
chr10 119245101 119245101 T C 0 0.1667 CCC sense 

文件2

chrom start end ref alt alt_freq_CR alt_freq_ID gene  gene_type 
chr10 28814618 28814618 T C 0 0.4167 AAA sense 
chr10 32557 32557 C T 0 0.1579 BBB PC 
chr10 119245101 119245101 T C 0 0.1667 DDD rega 
chr10 119245101 119245101 T C 0 0.1667 EEE sense 

我需要一個輸出文件,如果滿足以下條件, 如果來自file_1的列(第8列)基因和來自file_2的基因(第8列)匹配,則它應該如下打印:

chrom start end ref alt alt_freq_CR alt_freq_ID gene gene_type chrom start end ref alt alt_freq_CR alt_freq_ID 
chr10 28814618 28814618 T C 0 0.4167 AAA sense chr10 28814618 28814618 T C 0 0.4167 
chr10 32557818 32557818 C T 0 0.1579 BBB PC chr10 32557 32557 C T 0 0.1579 

我試圖用這個AWK如下,但它並沒有在輸出打印所有匹配的行..

awk 'FNR==NR{a[$16]=$0;next}{if(b=a[$16]){print b}}' file_1 file_2 

這將是如果在python腳本的解決方案真的很棒,而且這兩個文件大小不同,行數的間隔不同。

+0

你可能想閱讀關於'merge'和'join'的pandas文檔中的章節。 – cel

回答

1

如何:

index = df1.icol(7) == df2.icol(7) 
df = pd.concat((df1[index], df2[index]), axis = 1) 
+0

其實我的兩個文件長度不同,所以在上面的腳本中,我有以下錯誤消息,系列長度必須匹配才能比較 – user1017373

+0

我看到了。上述方法假設表格是對齊的;否則,匹配沒有很好的定義(或者記錄之間沒有一對一的對應關係,或者根據排序順序獲得不同的匹配)。如果記錄是對齊的,你可以截取每個表的最小長度;如果沒有對齊,你應該看看'join'方法。 –

1

你想用pandas.merge。用pandas.read_csv將您的文件讀入Pandas,並加入'gene'列。這是你的例子的解決方案。

In [9]: df1 
Out[9]: 
    chrom  start  end ref alt alt_freq_CR alt_freq_ID gene \ 
0 chr10 28814618 28814618 T C   0  0.4167 AAA 
1 chr10 32557818 32557818 C T   0  0.1579 BBB 
2 chr10 119245101 119245101 T C   0  0.1667 ZZZ 
3 chr10 119245101 119245101 T C   0  0.1667 CCC 

    gene_type 
0  sense 
1  PC 
2  rega 
3  sense 

In [10]: df2 
Out[10]: 
    chrom  start  end ref alt alt_freq_CR alt_freq_ID gene \ 
0 chr10 28814618 28814618 T C   0  0.4167 AAA 
1 chr10  32557  32557 C T   0  0.1579 BBB 
2 chr10 119245101 119245101 T C   0  0.1667 DDD 
3 chr10 119245101 119245101 T C   0  0.1667 EEE 

    gene_type 
0  sense 
1  PC 
2  rega 
3  sense 

In [11]: pd.merge(df1, df2, on='gene') 
Out[11]: 
    chrom_x start_x  end_x ref_x alt_x alt_freq_CR_x alt_freq_ID_x gene \ 
0 chr10 28814618 28814618  T  C    0   0.4167 AAA 
1 chr10 32557818 32557818  C  T    0   0.1579 BBB 

    gene_type_x chrom_y start_y  end_y ref_y alt_y alt_freq_CR_y \ 
0  sense chr10 28814618 28814618  T  C    0 
1   PC chr10  32557  32557  C  T    0 

    alt_freq_ID_y gene_type_y 
0   0.4167  sense 
1   0.1579   PC 

如您所見,此操作爲兩個DataFrame之間共享相同名稱的列添加後綴。後綴是必需的,但你可以用suffixes關鍵字參數更改後綴:

In [14]: pd.merge(df1, df2, on='gene', suffixes=['_df1', '_df2']) 
Out[14]: 
    chrom_df1 start_df1 end_df1 ref_df1 alt_df1 alt_freq_CR_df1 \ 
0  chr10 28814618 28814618  T  C    0 
1  chr10 32557818 32557818  C  T    0 

    alt_freq_ID_df1 gene gene_type_df1 chrom_df2 start_df2 end_df2 ref_df2 \ 
0   0.4167 AAA   sense  chr10 28814618 28814618  T 
1   0.1579 BBB   PC  chr10  32557  32557  C 

    alt_df2 alt_freq_CR_df2 alt_freq_ID_df2 gene_type_df2 
0  C    0   0.4167   sense 
1  T    0   0.1579   PC 

熊貓有一個詳盡指南merging其文檔。

相關問題