2015-11-13 4 views
0

У меня есть большой набор данных, который я читаю с помощью pandas, и я хочу сделать парное выравнивание по парам2.попарительное сравнение внутри столбца pandas python Biopython

import pandas as pd 
from pandas import DataFrame 
from Bio import pairwise2 #for pairwise alignments 
from Bio.pairwise2 import format_alignment #for printing alignments out neatly 

, но здесь я буду использовать макет набор данных:

data = { 'sequence': ['ACAAGAGTGGGACTATACAGTGGGTACAGTTATGACTTC', 'GCACGGGCCCTTGGCTAC', 'GCAACAAGGGGGGATACAGCGGGAACAGTGGACAAGTGGTTCGATGTC']} 

data = DataFrame(data) 

выглядеть следующим образом:

Out[34]: 
             sequence 
0   ACAAGAGTGGGACTATACAGTGGGTACAGTTATGACTTC 
1        GCACGGGCCCTTGGCTAC 
2 GCAACAAGGGGGGATACAGCGGGAACAGTGGACAAGTGGTTCGATGTC 

моя цель состоит в том, чтобы сделать попарное выравнивание в столбце «последовательности», поэтому первая строка сравнивается со второй, затем вторая сравнивается с третьей, третья сравнивается с первой и т. д. для большего набора данных.

мой код:

for seq in data['sequence']: 
    for a in pairwise2.align.globalxx(seq, seq): 
     print(format_alignment(*a)) #this is just to print the alignment out neatly. 

это печатает:

ACAAGAGTGGGACTATACAGTGGGTACAGTTATGACTTC 
||||||||||||||||||||||||||||||||||||||| 
ACAAGAGTGGGACTATACAGTGGGTACAGTTATGACTTC 
Score=39 

GCACGGGCCCTTGGCTAC 
|||||||||||||||||| 
GCACGGGCCCTTGGCTAC 
Score=18 

GCAACAAGGGGGGATACAGCGGGAACAGTGGACAAGTGGTTCGATGTC 
|||||||||||||||||||||||||||||||||||||||||||||||| 
GCAACAAGGGGGGATACAGCGGGAACAGTGGACAAGTGGTTCGATGTC 
Score=48 

, который близок к тому, что я хочу, но это только сравнивает первый на первый, второй на второй и третий на третий.

так я попытался это:

for seq in data['sequence']: #for each 'sequence' column value 
    for index, row in data.iterrows(): #for each row 
     for a in pairwise2.align.globalxx(seq, row['sequence']): #compare 'sequence' column value to each row of the 'sequence' column 
      print(format_alignment(*a)) 

это выдавало слишком много строк вывода я даже не буду пытаться разместить его здесь.

Моя идея состояла в том, чтобы сравнить значение «sequence» с строками столбца «sequence», но результат дал слишком много выравниваний, чем ожидалось. Я думаю, что двойной цикл - это не путь сюда. Я думаю, мой вопрос даже не имеет ничего общего с Biopython, просто как я могу сделать парные сравнения внутри одного столбца?

ответ

1

Использование комбинаторных генераторов от itertools.

for seq0, seq1 in itertools.combinations(data['sequence'], 2): 
    for a in pairwise2.align.globalxx(seq0, seq1): 
     print(format_alignment(*a)) 
Смежные вопросы