【问题标题】:printing out file if columns from two files match如果两个文件中的列匹配,则打印出文件
【发布时间】:2015-10-24 18:55:40
【问题描述】:

我有两个文件,一个看起来像这样,

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脚本中的解决方案,那就太好了,而且两个文件大小不同,行数不同。

【问题讨论】:

  • 您可能想阅读 pandas 文档中关于 mergejoin 的章节。

标签: python numpy pandas


【解决方案1】:

这个怎么样:

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

【讨论】:

  • 实际上我的两个文件长度不同,所以使用上面的脚本,我有以下错误消息,系列长度必须匹配才能比较
  • 我明白了。上述方法假设表格是对齐的;否则,匹配定义不明确(记录之间没有一对一的对应关系,或者您根据排序顺序获得不同的匹配项)。如果记录是对齐的,您可以按两者的最小长度截断每个表;如果假设没有对齐,您应该查看join 方法。
【解决方案2】:

您想使用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 的详尽指南。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2014-03-30
    • 2014-08-28
    • 2021-06-26
    • 2018-07-12
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多