列内的成对比较 pandas python Biopython
pairwise comparison within a column pandas python Biopython
我有一个大数据集,我用 pandas 读取了它,我想通过 pairwise2 进行成对对齐。
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
我的目标是在 'sequence' 列内进行成对对齐,因此第一行与第二行进行比较,然后第二行与第三行进行比较,第三行与第一行进行比较,依此类推更大的数据集。
我的代码:
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))
这给出了太多的输出行,我什至不打算在这里尝试 post。
我的想法是将 'sequence' 值与 'sequence' 列的行进行比较,但输出比预期的对齐方式太多。我认为双循环不是去这里的方法。 我想我的问题甚至与 Biopython 没有任何关系,只是我如何在一列中进行成对比较?
使用 itertools
中的组合生成器。
for seq0, seq1 in itertools.combinations(data['sequence'], 2):
for a in pairwise2.align.globalxx(seq0, seq1):
print(format_alignment(*a))
我有一个大数据集,我用 pandas 读取了它,我想通过 pairwise2 进行成对对齐。
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
我的目标是在 'sequence' 列内进行成对对齐,因此第一行与第二行进行比较,然后第二行与第三行进行比较,第三行与第一行进行比较,依此类推更大的数据集。
我的代码:
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))
这给出了太多的输出行,我什至不打算在这里尝试 post。
我的想法是将 'sequence' 值与 'sequence' 列的行进行比较,但输出比预期的对齐方式太多。我认为双循环不是去这里的方法。 我想我的问题甚至与 Biopython 没有任何关系,只是我如何在一列中进行成对比较?
使用 itertools
中的组合生成器。
for seq0, seq1 in itertools.combinations(data['sequence'], 2):
for a in pairwise2.align.globalxx(seq0, seq1):
print(format_alignment(*a))