我有两个文件,如下所示,
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 :(得分: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的详尽指南。