2013-02-01 101 views
3

我正在研究python程序來計算突變殘基的數字編碼和一組字符串(蛋白質序列)的位置,以fasta格式文件存儲,每個蛋白質序列用逗號分隔。我試圖找到突變的位置和序列。蛋白質序列編碼

我的fasta文件如下:

MTAQDDSYSDGKGDYNTIYLGAVFQLN,MTAQDDSYSDGRGDYNTIYLGAVFQLN,MTSQEDSYSDGKGNYNTIMPGAVFQLN,MTAQDDSYSDGRGDYNTIMPGAVFQLN,MKAQDDSYSDGRGNYNTIYLGAVFQLQ,MKSQEDSYSDGRGDYNTIYLGAVFQLN,MTAQDDSYSDGRGDYNTIYPGAVFQLN,MTAQEDSYSDGRGEYNTIYLGAVFQLQ,MTAQDDSYSDGKGDYNTIMLGAVFQLN,MTAQDDSYSDGRGEYNTIYLGAVFQLN 

實施例:
下圖(基於另一組FASTA文件的)將解釋這背後的算法。在該圖中,第一個框表示輸入文件序列的對齊。最後一個框表示輸出文件。我如何用Python中的fasta文件做到這一點?

例如輸入文件:

MTAQDD,MTAQDD,MTSQED,MTAQDD,MKAQHD 


     positions 1 2 3 4 5 6     1 2 3 4 5 6  
protein sequence1 M T A Q D D      T A  D 
protein sequence2 M T A Q D D      T A  D  
protein sequence3 M T S Q E D      T S  E  
protein sequence4 M T A Q D D      T A  D  
protein sequence5 M K A Q H D      K A  H 

    PROTEIN SEQUENCE ALIGNMENT     DISCARD NON-VARIABLE REGION  

     positions 2 2 3 3 5 5 5  
protein sequence1 T  A  D  
protein sequence2 T  A  D  
protein sequence3 T  S  E  
protein sequence4 T  A  D  
protein sequence5  K A   H 

突變殘基IS SPLITED分隔列

輸出文件應該是這樣的:

position+residue 2T 2K 3A 3S 5D 5E 5H  
     sequence1 1 0 1 0 1 0 0  
     sequence2 1 0 1 0 1 0 0  
     sequence3 1 0 0 1 0 1 0  
     sequence4 1 0 1 0 1 0 0  
     sequence5 0 1 1 0 0 0 1 

    (RESIDUES ARE CODED 1 IF PRESENT, 0 IF ABSENT) 

這裏有兩種方法我都試過這樣做:

ls= 'MTAQDDSYSDGKGDYNTIYLGAVFQLN,MTAQDDSYSDGRGDYNTIYLGAVFQLN,MTSQEDSYSDGKGNYNTIMPGAVFQLN,MTAQDDSYSDGRGDYNTIMPGAVFQLN,MKAQDDSYSDGRGNYNTIYLGAVFQLQ,MKSQEDSYSDGRGDYNTIYLGAVFQLN,MTAQDDSYSDGRGDYNTIYPGAVFQLN,MTAQEDSYSDGRGEYNTIYLGAVFQLQ,MTAQDDSYSDGKGDYNTIMLGAVFQLN,MTAQDDSYSDGRGEYNTIYLGAVFQLN'.split(',') 
pos = [set(enumerate(x, 1)) for x in ls] 
a=set().union(*pos) 
alle = sorted(set().union(*pos)) 
print '\t'.join(str(x) + y for x, y in alle) 
for p in pos: 
    print '\t'.join('1' if key in p else '0' for key in alle) 

(在這裏我得到的突變以及非突變殘基列,但我想只針對突變的殘基列)

from pandas import * 
data = 'MTAQDDSYSDGKGDYNTIYLGAVFQLN,MTAQDDSYSDGRGDYNTIYLGAVFQLN,MTSQEDSYSDGKGNYNTIMPGAVFQLN,MTAQDDSYSDGRGDYNTIMPGAVFQLN,MKAQDDSYSDGRGNYNTIYLGAVFQLQ,MKSQEDSYSDGRGDYNTIYLGAVFQLN,MTAQDDSYSDGRGDYNTIYPGAVFQLN,MTAQEDSYSDGRGEYNTIYLGAVFQLQ,MTAQDDSYSDGKGDYNTIMLGAVFQLN,MTAQDDSYSDGRGEYNTIYLGAVFQLN' 
df = DataFrame([list(row) for row in data.split(',')]) 
df = DataFrame({str(col+1)+val:(df[col]==val).apply(int) for col in df.columns for val in set(df[col])}) 
print df.select(lambda x: not df[x].all(), axis = 1) 

(這裏是給輸出,而不是在有序即首先2K然後2T然後3A那樣)。

我應該怎麼做?

+0

是你[確定](http://stackoverflow.com/questions/14498730/numerical-coding-of-mutated-residues-and-positions/14500175#14500175)或[此](http://stackoverflow.com/questions/14498730/numerical-coding-of-mutated-residues-and-positions) – root

+0

@root對於我的fasta文件,它以無序的方式提供 – user2020442

回答

1

功能get_dummies讓你最方式:

In [11]: s 
Out[11]: 
0 T 
1 T 
2 T 
3 T 
4 K 
Name: 1 

In [12]: pd.get_dummies(s, prefix=s.name, prefix_sep='') 
Out[12]: 
    1K 1T 
0 0 1 
1 0 1 
2 0 1 
3 0 1 
4 1 0 

而這些列具有不同的值:

In [21]: (df.ix[0] != df).any() 
Out[21]: 
0 False 
1  True 
2  True 
3 False 
4  True 
5 False 

把這些結合在一起:

In [31]: I = df.columns[(df.ix[0] != df).any()] 

In [32]: J = [pd.get_dummies(df[i], prefix=df[i].name, prefix_sep='') for i in I] 

In [33]: df[[]].join(J) 
Out[33]: 
    1K 1T 2A 2S 4D 4E 4H 
0 0 1 1 0 1 0 0 
1 0 1 1 0 1 0 0 
2 0 1 0 1 0 1 0 
3 0 1 1 0 1 0 0 
4 1 0 1 0 0 0 1 

注:我創建如下的初始DataFrame,但這可能會更有效地取決於納克您的情況:

df = pd.DataFrame(map(list, 'MTAQDD,MTAQDD,MTSQED,MTAQDD,MKAQHD'.split(','))) 
相關問題