Как сравнить колонки из двух CSV в питоне?

1

Привет У меня есть два CSV файла в качестве входных данных, например:

file1:

AK163828 chr5 s1 + e1 cttt 4
AK163828 chr5 s2 + e2 gtca 4
AK168688 chr6 s3 + e3 ggcg 4
AK168688 chr6 s4 + e4 tctg 4

file2:

chr6s3+e3 ggcg
chr5s1+e1 cttt
chr6s4+e4 tata
chr5s2+e2 ggcg

#as you can see the file2 is randomly sorted

Я хочу сравнить столбец 1 файла2 со столбцом 2, 3, 4, 5, объединенным с файлом 1 и в то же время столбцом 2 файла2 со столбцом 6 файла 1 и выбрать только соответствующие строки.

Желаемый результат:

chr6s3+e3 ggcg
chr5s1+e1 cttt

Я попытался использовать этот код:

import csv

reader1 = csv.reader(open(file1), dialect='excel-tab' )
reader2 = csv.reader(open(file2), dialect='excel-tab' )

     for row1, row2 in zip(reader1,reader2):
            F1 = row1[1] + row1[2] + row1[3] + row1[4] + '\t' row1[5]
            F2 = row2[0] + '\t' + row2[1]
            print set(F1) & set(F2)

Но это не сработает. Можете ли вы помочь мне исправить мой код или дать мне другой способ сделать это? Спасибо за вашу помощь!

  • 0
    biostar было бы хорошим местом, чтобы задать этот вопрос ;-) biostar.stackexchange.com
  • 0
    @Pierre да, я знаю, но я предпочитаю начать задавать вопросы здесь, потому что этот вопрос ориентирован на код, и я считаю, что здесь есть больше людей, которые знают программирование.
Теги:
csv
bioinformatics
compare

2 ответа

3
Лучший ответ

Быстрая и грязная:

import csv

file1 = 'C:/Users/Me/Desktop/file1'
file2 = 'C:/Users/Me/Desktop/file2'

reader1 = csv.reader(open(file1))
reader2 = csv.reader(open(file2))

F1 = set(''.join(row1[0].strip().split()[1:6]) for row1 in reader1)
F2 = set(''.join(row2[0].strip().split()) for row2 in reader2)

for sequence in F1.intersection(F2):
    print(sequence[:-4]),
    print('\t'),
    print(sequence[-4:])

Вывод:

chr6s3+e3   ggcg
chr5s1+e1   cttt
1

Как насчет этого:

import csv

reader1 = csv.reader(open('file1.tsv'), dialect='excel-tab' )
reader2 = csv.reader(open('file2.tsv'), dialect='excel-tab' )

keys = set()

for row in reader1:
    keys.add((''.join(row[1:5]), row[5]))

for row in reader2:
    if (row[0], row[1]) in keys:
        print '\t'.join(row)

Кстати: формат, который вы используете (dialect='excel-tab'), обычно называется TSV, а не CSV, хотя это вариант CSV. Вы также должны убедиться, что ваши значения разделены вкладками, а не пробелами, например, в вашем сообщении. Я думаю, что они есть, и у вас есть только пробелы из-за проблем с форматированием стека?

  • 1
    Вы хорошо догадались, я собираюсь попробовать ваш код.
  • 0
    Надеюсь, у вас есть вкладки, иначе это не сработает. Если вы действительно используете пробелы для разделения столбцов, вы должны использовать эту строку для создания читателей: reader1 = csv.reader(open('file1.tsv'), delimiter=' ')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню