从 pandas 数据框列中查找所有正则表达式匹配项

Posted

技术标签:

【中文标题】从 pandas 数据框列中查找所有正则表达式匹配项【英文标题】:finding all regex matches from a pandas dataframe column 【发布时间】:2017-07-11 18:54:52 【问题描述】:

我正在尝试从数据框中提取一些数据,但是以下查询仅提取第一个匹配项并忽略其余匹配项,例如,如果整个数据是:

df['value']=
           0   123 blah blah blah, 456 blah blah blah, 129kfj blah blah
           1   237 blah blah blah, 438 blah blah blah, 365kfj blah blah 
           ...

而正则表达式是:

df['newCol']=df['value'].str.extract("[0-9]3")

我希望结果是一个新的列名“newCol”:

newCol
------
123,456,129
237,438,365
...

但我得到的实际结果只是第一个数字:

newCol
------
123
237

这里有什么问题? :(

谢谢

更新:

感谢 MaxU,我找到了解决方案,只有几个建议。我有 Pandas 0.18.1,所以在我将 pandas 更新到 0.19 之前,extractall 对我不起作用,所以如果你对 Extractall 有问题,请记得检查你的 pandas 版本...其次,apply(','.join) 没有为我工作,因为我有一些非字符串值(Null 值)并且它无法处理它,所以我使用了 Lambda,它最终与 MaxU 解决方案的一个小修改一起工作。

x['value'].str.extractall(r'(\d3)').unstack().apply(lambda x:','.join(x.dropna()), axis=1) 

【问题讨论】:

extract 仅返回第一个匹配项。你想要extractall。查看 MaxU 的答案 【参考方案1】:

你可以使用Series.str.extractall()方法:

In [57]: x
Out[57]:
                                                    value
0  123 blah blah blah 456 blah blah blah 129kfj blah blah
1  237 blah blah blah 438 blah blah blah 365kfj blah blah

In [58]: x['newCol'] = x['value'].str.extractall(r'(\d3)').unstack().apply(','.join, 1)

In [59]: x
Out[59]:
                                                    value       newCol
0  123 blah blah blah 456 blah blah blah 129kfj blah blah  123,456,129
1  237 blah blah blah 438 blah blah blah 365kfj blah blah  237,438,365

更新:

In [77]: x
Out[77]:
                                                      value
0  123 blah blah blah, 456 blah blah blah, 129kfj blah blah
1  237 blah blah blah, 438 blah blah blah, 365kfj blah blah

In [78]: x['value'].str.extractall(r'(\d3)').unstack().apply(','.join, 1)
Out[78]:
0    123,456,129
1    237,438,365
dtype: object

【讨论】:

现在我',收到此错误:AssertionError: 1 列已通过,传递的数据有 6 列...阅读此内容(***.com/questions/24145140/…)我认为它正在将“129kfj”视为 1,2, 9,k,f,j 但我不明白为什么 @Faranak,我无法重现此错误...您可以逐步尝试以查看哪个部分产生此错误:x['value'].str.extractall(r'(\d3)')x['value'].str.extractall(r'(\d3)').unstack() 等跨度> 我刚刚将 extract 更改为 extractall 并产生此错误:df['value'].str.extractall("[0-9]3") 但这不是我的解决方案,它是你的...... ;-) 用我的 RegEx 试试 大声笑我跑了这个:x['value'].str.extractall(r'(\d3)') 仍然相同的错误:1 列传递,传递的数据有 3 列跨度>

以上是关于从 pandas 数据框列中查找所有正则表达式匹配项的主要内容,如果未能解决你的问题,请参考以下文章

从字符串 PySpark 数据框列中删除正则表达式

Pandas:如何将数据框列中的“时间戳”值从对象/字符串转换为时间戳?

从 Pandas 数据框列中删除“秒”和“分钟”

从 pandas 数据框列中的对象中删除逗号

如何从 Pandas 数据框列中的日期时间减去 3 小时?

Pandas 正则表达式返回括号中的值