2015-10-23 42 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其文档。

相关问题