2015-10-23 1 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 

мне нужна выходной файл, если он удовлетворяет следующие условия, как, , если столбец (8-й столбец) гена из file_1 и гена (восьмой столбец) из file_2 имеют соответствие, то его следует распечатывать следующим образом,

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 

Было бы очень здорово, если есть решение в питон скрипт, Кроме того, два файла разного размера, промежутки числа строк различны.

+0

вы можете прочитать главы в документах pandas о 'merge' и' join'. – 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 с помощью pandas.read_csv и присоединитесь к столбцу '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 

Как вы можете видеть, эта операция добавляет суффикс к столбцам, которые разделяют то же имя между двумя DataFrames. Суффикс требуется, но вы можете изменить суффикс с аргументом 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 в его документации.

Смежные вопросы