【问题标题】:How to remove parentheses and all data within using Pandas/Python?如何使用 Pandas/Python 删除括号和所有数据?
【发布时间】:2014-01-20 14:01:25
【问题描述】:

我有一个数据框,我想删除其中的所有括号和内容。

我检查了: How can I remove text within parentheses with a regex?

删除数据的答案在哪里

re.sub(r'\([^)]*\)', '', filename)

我也试过了

re.sub(r'\(.*?\)', '', filename)

但是,我收到一个错误:expected a string or buffer

当我尝试使用df['Column Name'] 列时,我得到了no item named 'Column Name'

我使用df.head() 检查了数据框,它显示为一个干净的表,其中的列名是我想要的......但是当我使用re 表达式删除(东西)它时无法识别我拥有的列名。

我一般用

df['name'].str.replace(" ()","") 

但是,我想删除括号和里面的内容....如何使用正则表达式或熊猫来做到这一点?

谢谢!

这是我使用的解决方案...感谢您的帮助!

All['Manufacturer Standard Name'] = All['Manufacturer Standard Name'].str.replace(r"\(.*\)","")

【问题讨论】:

  • 请发帖df.columns
  • 如果答案适合你,请打勾。否则,请告诉我们出了什么问题。
  • 如果有人在这里举个例子会很好,任何人都可以告诉,这个问题是关于数据框的,在哪一列中的值像 141(32), 982(21),9083 (1231) 所以在删除括号后,我们会得到像 141,982,9083 这样的数据??所以请回复我,以便我或更多像我这样的人能够理解这一点。

标签: python regex pandas removeall


【解决方案1】:
df['name'].str.replace(r"\(.*\)","")

您不能直接在 pandas 对象上运行 re 函数。您必须为对象内的每个元素循环它们。所以Series.str.replace((r"\(.*\)", "") 只是Series.apply(lambda x: re.sub(r"\(.*\)", "", x)) 的语法糖。

【讨论】:

  • 如果我想在括号前后加一个空格怎么办?
  • @B_Furtado: " \(.*\) ""\s\(.*\)\s",假设您总是两边都有一个空格。如果要替换任意数量的空格(包括无),请使用"\s*\(.*\)\s*"。你应该学习 regex 语法,这样的简单匹配并不难。检查docs.python.org/3/library/re.html
  • 谢谢@dmvianna。我不断学习,然后我从不使用,我忘记了......最好,
  • 我一直在玩 r"(.*)",但我不明白后面的表达式和 r"(.)" 之间的区别。原则上是“。”指代括号内的任何字符,为什么我们需要 '*' ?
  • @R_user: '.'指代任何字符,不带其他参数将指代单个字符。 '*' 表示前一个字符(任何)可以在零到任何时间找到。所以在'abc''。将匹配“a”(一个字符),而“.*”将匹配“abc”(所有字符)。
【解决方案2】:

如果数据中有多个 (...) 子字符串,则应考虑使用其中一个

All['Manufacturer Standard Name'] = All['Manufacturer Standard Name'].str.replace(r"\(.*?\)","")

All['Manufacturer Standard Name'] = All['Manufacturer Standard Name'].str.replace(r"\([^()]*\)","")

不同之处在于.*? 速度较慢且不匹配换行符,而[^()] 匹配除() 之外的任何字符并且效率很高并且匹配换行符。第一个将匹配(...(...),但第二个将仅匹配(...)

如果您想在删除这些子字符串后对所有空格进行规范化,您可以考虑

All['Manufacturer Standard Name'] = All['Manufacturer Standard Name'].str.replace(r"\s*\([^()]*\)","").str.strip()

\s*\([^()]*\) 正则表达式将匹配 0+ 个空格,然后括号之间的字符串和 str.stip() 将删除任何潜在的尾随空格。

【讨论】:

  • 这必须是 最佳 答案,因为它处理重复的括号(和前导空格),如 this example
【解决方案3】:

#删除不需要的字符

Energy['Country'] = Energy['Country'].str.replace(r" \(.*\)","")

块引用

Energy['Country'] = Energy['Country'].str.replace(r"([0-9]+)$","")

这些方法也可以消除不需要的错误

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 2017-02-17
    • 1970-01-01
    • 2021-10-26
    • 2022-11-16
    • 2016-11-02
    • 2022-12-23
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多