如果两个文件中的列匹配

时间:2015-10-23 16:32:16

标签: python numpy pandas

我有两个文件,如下所示,

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脚本中有解决方案,那真的很棒。另外两个文件大小不同,行数不同。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

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

答案 1 :(得分: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

Pandas在其文档中提供了merging的详尽指南。