从Pandas数据帧列中查找所有正则表达式匹配项。

7
我可以帮您进行翻译。以下是需要翻译的内容:

我正在尝试从数据框中提取一些数据,但是下面的查询语句只会提取第一个匹配项并忽略其余的匹配项。例如,如果整个数据如下:

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,所以extractall对我无效,直到我将pandas更新到0.19,因此请记住检查您的pandas版本是否与Extractall存在问题...其次,apply(',' .join)对我无效,因为我有一些非字符串值(Null值),它无法处理,所以我使用了Lambda,并且最终在MaxU解决方案的小修改下成功了。

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

extract 仅返回第一个匹配项。您需要extractall。请参见MaxU的回答。 - Moses Koledoye
1个回答

6

你可以使用 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'(\d{3})').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'(\d{3})').unstack().apply(','.join, 1)
Out[78]:
0    123,456,129
1    237,438,365
dtype: object

@Faranak,我无法重现这个错误... 你能否逐步尝试一下,以便查看哪个部分会产生这个错误:x['value'].str.extractall(r'(\d{3})')x['value'].str.extractall(r'(\d{3})').unstack()等。 - MaxU - stand with Ukraine
但这不是我的解决方案,而是你的...;-) 用我的正则表达式试试看。 - MaxU - stand with Ukraine
@Faranak,当您仅执行此操作时,是否会出现以下错误:df['value'].str.extractall(r'(\d{3})') __而不__将其分配给新列? - MaxU - stand with Ukraine
pandas 版本是 0.18.1...啊,好的,我现在更新它,希望能够正常工作 :( - faranak777
你说得对,我升级了Pandas,现在如果我运行这个命令,它就可以正常工作了:df['value'].str.extractall(r'(\d{3})')...但是当我加上.unstack().apply(','.join, 1)时,就会出现以下错误:TypeError: ('sequence item 1: expected str instance, NoneType found', 'occurred at index 0')。 - faranak777
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接