Как сравнить столбцы из двух CSV в python?

#python #csv #compare #bioinformatics

#python #csv #Сравнить #биоинформатика

Вопрос:

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

файл1 :

 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 из file2 со столбцами 2, 3, 4, 5, объединенными из file1, и в то же время столбец 2 из file2 со столбцом 6 из file 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) amp; set(F2)
  

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

Комментарии:

1. biostar было бы хорошим местом, чтобы задать этот вопрос 😉 biostar.stackexchange.com

2. @Pierre да, я знаю, но я предпочитаю начать задавать здесь, потому что этот вопрос ориентирован на код, и я верю, что здесь больше людей, которые разбираются в программировании.

Ответ №1:

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

 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
  

Ответ №2:

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

 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. Вы также должны убедиться, что ваши значения разделены символами табуляции, а не пробелами, как в вашем сообщении. Я предполагаю, что это так, и у вас есть только пробелы из-за проблем с форматированием Stack Overflow?

Комментарии:

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