【问题标题】:Update pandas value when regex condition is satisfied with regex replace正则表达式替换满足正则表达式条件时更新熊猫值
【发布时间】:2019-10-20 11:29:53
【问题描述】:

提供一个像这样的 DataFrame,由超过 10k 条记录组成:

    RecSeq Length   Recognition Sequence    Enzymes
4023    12  CCANNNNNNTGG    BstXI
4024    12  CGANNNNNNTCC    HdeNY26I
4025    12  CGANNNNNNTGC    BcgI
4026    12  GAACNNNNNCTC    PpiI
4027    12  GAAGNNNNNCTC    Mcr10I
4028    12  GACNNNNNNGTC    AasI
4029    12  GACNNNNNNGTC    DrdI
4030    12  GACNNNNNNGTC    DseDI

我想使用正则表达式替换 Recognition Sequence 列下的任何 N,这将用 [A|C|G|T] 替换 N。目前,我正在使用iterrows 执行此操作,方法是将每条记录添加到一个新的数据帧中(else 条件保留该行,所以我没有在其中包含它的代码)。方法如下:

new_df = []
    for idx, i in df.iterrows():
        if re.search('N', i[1]) != None:
            value = str(i[1])
            updated = value.replace('N', '[A|C|G|T]')
            whole_line = str(updated +','+ i[2],+','+i[0])
            new_df.append(whole_line)
            df1  = pd.DataFrame(new_df)

这种方法看起来很慢,因为它遍历每个元素,而且我知道在处理 pandas 时,迭代始终是最后一种方法。我想实现一个np.where,正如其他问题或更通用或更强大的东西所解释的那样。

是的,每个N 都应该替换为[A|C|G|T]。这就是我对代码所做的事情。

【问题讨论】:

  • 所以如果字符串中存在 10 个 N,您想添加 10 次 [A|C|G|T] 吗?例如CGNNNT 将更改为CG[A|C|G|T][A|C|G|T][A|C|G|T]T。还有N是什么不一起出现,比如CGNTN,那你要什么输出呢?
  • 您能否也发布您的预期输出,这样我们就不必猜测您到底想要什么。

标签: python-3.x pandas numpy scipy


【解决方案1】:
df = pd.DataFrame({"A":['CCANNNNNNTGG']})

df
        A
0   CCANNNNNNTGG

import re
def my_func(x):
    return re.sub(r'N', [A|C|G|T], x)

df['A'] = df.A.apply(my_func)

df
0    CCA[A|C|G|T][A|C|G|T][A|C|G|T][A|C|G|T][A|C|G|T][A|C|G|T]TGG
Name: A, dtype: object

【讨论】:

  • 这段代码只对每个N进行一次替换
  • @Shred 您只需要更改正则表达式。您可以随时根据您的要求编辑正则表达式。我已经更新了答案。
  • 该死的,我这样做真是太愚蠢了。在我的情况下,我发现使用str.replace 更合适,但是您使用df.apply 的方法在多个正则表达式条件下变得有用且干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2019-01-24
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多