【问题标题】:How to separate numbers from a data frame using regular expression?如何使用正则表达式从数据框中分离数字?
【发布时间】:2019-11-01 09:32:16
【问题描述】:

我已将 Excel 工作表中的一整列读入数据框。该列中的每个单元格都有一堆带数字的单词(如电话号码)。如何循环数据框并使用正则表达式使用特定模式提取数字。

我试过下面的代码

for i in (df): 
   df.str.contains('(4[0-9]{12}([0-9]{3})|[25][1-7][0-9]{14}|6(011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}')

我知道我的正则表达式错误,但我收到以下错误。

编辑:我已经更新了我的正则表达式。单元格有这样的数据

“你好,我想点东西……我的卡号是 45621……” 我想把卡号拿出来存一个文件。

Traceback (most recent call last):
  File "c:/Program Files/Python37/Scripts/output.py", line 12, in <module>
    df.str.contains('^f')
  File "C:\Program Files\Python37\lib\site-packages\pandas\core\generic.py", line 5067, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'str'

【问题讨论】:

  • 添加一些示例数据,以便我们查看您的“特定模式”是什么样的。
  • .str 是为 Series 对象定义的,而不是 DataFrame 对象。请阅读docs
  • @Erfan 是的,我添加了一个示例模式。

标签: python-3.x pandas dataframe


【解决方案1】:
  1. 先导入正则表达式
import re
  1. 最好新建一列
df['new_1'] = re.search('4[0-9]{12}([0-9]{3})|[25][1-7][0-9]{14}|6(011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}', df['<num_col_name>'])
  1. 现在检查new_1
df['new_1]

您还没有发布您想要浏览的专栏,所以我不得不使用您输入的字符串。

【讨论】:

    【解决方案2】:

    现在你正在打电话给df.str。这意味着您正在尝试访问数据框的 str 对象,这对 python 没有意义,因此会出现错误。不知道你想在那里做什么。在您的循环中,i 将是列。从那里您可以遍历行,然后应用正则表达式。这在整个堆栈溢出中都有记录,但可能不是您想要采用的方法。

    相反,您应该创建一个函数,将单元格作为字符串接收并输出正则表达式后的字符串。然后,您可以在 pandas 中使用 apply() 将该函数一次全部应用于每个单元格。如果你用谷歌搜索“apply() pandas regex”,一堆不同的例子会告诉你如何做到这一点。一个这样的例子是this one

    如果您提供更多关于您尝试完成的正则表达式的详细信息,我们可以帮助您更详细地制作上述结构。

    【讨论】:

    • 他很可能尝试使用 pandas 提供的字符串访问器。使用apply 不应该是他的首选,即使是列表理解也会更好。
    • 我添加了更多信息。谢谢!
    猜你喜欢
    • 2020-08-04
    • 2021-07-09
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多