【问题标题】:Replacing strings in pandas data frame using dictionary without overwriting使用字典替换熊猫数据框中的字符串而不覆盖
【发布时间】:2019-01-25 19:12:51
【问题描述】:

我正在尝试使用填充有如下值的列来转换 pandas 数据框:

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,然后 Gln 中的 G 被 G 覆盖: Gly key : 字典中的值对来获取 Glyln。有什么办法可以解决这个问题吗??

谢谢!!

【问题讨论】:

    标签: python regex pandas dictionary


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      乔恩的回答很棒。根据他的意见,另一种方法是这样,

      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
      

      【讨论】:

      • 如果您打算采用这种方法,那么lookup.get(x, x) for x in row 是一种避免显式 if/else 检查的方法...
      • 太棒了。我正在寻找如何避免 if/else 检查自己。谢谢!
      猜你喜欢
      • 2020-04-25
      • 2018-08-01
      • 2021-09-07
      • 2017-09-04
      • 2022-10-13
      • 2017-09-09
      • 2018-07-27
      • 2017-07-08
      相关资源
      最近更新 更多