我正在尝试使用填充有这样的值的列来转换熊猫数据框:
df['Alteration']
Q79K,E17K
Q79K,E17K
T315I
并希望将单字母氨基酸转换为其三字母代码,使其看起来像这样:
Gln79Lys,Glu17Lys
Gln79Lys,Glu17Lys
Thr315Ile
到目前为止,我已经尝试过使用以正则表达式为键的字典,例如:
AA_code = {re.compile('[C]'): 'Cys',re.compile('[D]'): 'Asp',
re.compile('[S]'): 'Ser',re.compile('[Q]'): 'Gln',re.compile('[K]'): 'Lys',
re.compile('[I]'): 'Ile',re.compile('[P]'): 'Pro',re.compile('[T]'): 'Thr',
re.compile('[F]'): 'Phe',re.compile('[N]'): 'Asn',re.compile('[G]'): 'Gly',
re.compile('[H]'): 'His',re.compile('[L]'): 'Leu',re.compile('[R]'): 'Arg',
re.compile('[W]'): 'Trp',re.compile('[A]'): 'Ala',re.compile('[V]'): 'Val',
re.compile('[E]'): 'Glu',re.compile('[Y]'): 'Tyr',re.compile('[M]'): 'Met'}
以及以下根据字典替换的代码:
df['Replacement'] = dfx2['Alteration'].replace(AA_code, regex=True)
但是,在替换函数覆盖值的情况下,出现了一些奇怪的现象,看起来像这样:
Glyln79Leuys,Glu17Leuys
Glyln79Leuys,Glu17Leuys
Thr315Ile
据我了解,Glyln源自代码,首先将Q更改为Gln,然后 G ln中的 G 被G覆盖: Gly键:字典中的值对可获取Glyln。有什么办法可以解决这个问题?
谢谢!
答案 0 :(得分:1)
制作单个查询表,然后将其用于Series.str.replace
中的可调用项,例如:
import pandas as pd
lookup = {
'Q': 'Gln',
'K': 'Lys',
'E': 'Glu',
'G': 'Gly'
# needs completing...
}
s = pd.Series(['Q79K,E17K', 'Q79K,E17K', 'T315I'])
s.str.replace('([{}])'.format(''.join(lookup)), lambda m: lookup[m.group(1)])
给你:
0 Gln79Lys,Glu17Lys
1 Gln79Lys,Glu17Lys
2 T315I
答案 1 :(得分:0)
乔恩的答案很棒。遵循他的意见,另一种方法是
import pandas as pd
lookup = {
'Q': 'Gln',
'K': 'Lys',
'E': 'Glu',
'G': 'Gly'
# needs completing...
}
s = pd.Series(['Q79K,E17K', 'Q79K,E17K', 'T315I'])
s.apply(lambda row: "".join([lookup[x] if x in lookup else x for x in row]))
,或者,如@Jon Clements在评论中所建议的,
s.apply(lambda row: "".join([lookup.get(x,x) for x in row]))
为您提供
0 Gln79Lys,Glu17Lys
1 Gln79Lys,Glu17Lys
2 T315I
dtype: object