如何使用正则表达式从数据框中分离数字?

Posted

技术标签:

【中文标题】如何使用正则表达式从数据框中分离数字?【英文标题】: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'

【问题讨论】:

***.com/questions/3868753/… 添加一些示例数据,以便我们查看您的“特定模式”是什么样的。 .str 是为 Series 对象定义的,而不是 DataFrame 对象。请阅读docs @Erfan 是的,我添加了一个示例模式。 【参考方案1】:
    先导入正则表达式
import re
    最好新建一列
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>'])
    现在检查new_1
df['new_1]

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

他很可能尝试使用 pandas 提供的字符串访问器。使用apply 不应该是他的首选,即使是列表理解也会更好。 我添加了更多信息。谢谢!

以上是关于如何使用正则表达式从数据框中分离数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在记事本++替换中分隔正则表达式组号?

如何用正则表达式限制文本框输入数字位数?

如何用正则表达式限制文本框输入数字位数

如何根据正则表达式从 pd 系列或数据框中删除行?

使用正则表达式在 Pandas 数据框中字符串开头的大括号内去除数字

Python 正则表达式 利用括号分组