使用字典替换熊猫数据框中的字符串而不会覆盖

时间:2018-08-19 12:06:26

标签: python regex pandas dictionary

我正在尝试使用填充有这样的值的列来转换熊猫数据框:

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。有什么办法可以解决这个问题?

谢谢!

2 个答案:

答案 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