【问题标题】:Trouble writing function to remove prefixes in Python在 Python 中编写删除前缀的函数时遇到问题
【发布时间】:2022-01-03 06:15:18
【问题描述】:

我正在尝试编写一个函数,该函数将从 Pandas 数据框中的列的每个元素中删除前缀。我做了一些尝试,但似乎都没有成功:

prefixes = ['mm10---', 'GRCh38-']
def clean_genes(column):
    for gene in CTRL_data[f'{column}']:
        for prefix in prefixes:
            if row[f"{column}"].str.startswith(f"{prefix}"):
                gene = str.replace(f"{prefix}", '', gene)
    return column

def clean_genes(column):
    for gene in CTRL_data[f"{column}"]:
        gene = gene[7:]
    return column

clean_genes(gene)

有人能指出这些尝试出错的地方吗,或者我怎样才能更好地编写这个函数?两种情况的错误都是:

NameError                                 Traceback (most recent call last)
/var/folders/pg/d3z5dn_x0f51tlwtj7391tjh0000gn/T/ipykernel_10029/2341573264.py in <module>
     16     return column
     17 
---> 18 clean_genes(gene)

NameError: name 'gene' is not defined

编辑: 我还查看了此站点和其他站点上的其他一些问题,包括我认为有帮助的这个问题 (Remove specific characters from a string in Python)。

【问题讨论】:

  • gene 未在 clean_genes 函数之外定义。此外,您还有 2 个名为 clean_genes 的函数。
  • clean_genes(gene) gene 定义在哪里?
  • name 'gene' is not defined 有什么不清楚的地方?
  • @Julien 'gene' 是我的数据框中列的名称。这不是或多或少等同于写column=gene吗?
  • 不,它不是这样工作的。变量名gene 和字符串'gene' 不是一回事。计算机不理解“或多或少”...

标签: python pandas for-loop


【解决方案1】:

如果您的问题实际上是“如何从 Pandas 数据框系列中删除多个前缀”,那么我可能会说

  1. create a regular expression 匹配这些前缀
  2. 在这些系列上使用.str.replace

这也可能比手动循环快很多。

import re
prefixes = ['mm10---', 'GRCh38-']

# Build a regexp that matches either of the given prefixes, anchored
# to the start of the string.
prefix_re = re.compile("^(" + "|".join(re.escape(prefix) for prefix in prefixes) + ")")

df["my_series"] = df["my_series"].str.replace(prefix_re, "")

【讨论】:

    【解决方案2】:

    您可以通过构建与您的任一前缀匹配的正则表达式来删除前缀,然后使用正则表达式将它们替换为空字符串,如下所示:

    re = r'^(mm10\-\-\-|GRCh38\-)'
    df["my_series"] = df["my_series"].str.replace(re, "") 
    

    【讨论】:

    • - 不是字符类之外的正则表达式中的特殊字符,不需要转义。
    猜你喜欢
    • 2023-01-04
    • 2014-06-17
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多