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

far*_*777 6 python regex pandas

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

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 
           ...
Run Code Online (Sandbox Code Playgroud)

正则表达式是:

df['newCol']=df['value'].str.extract("[0-9]{3}")
Run Code Online (Sandbox Code Playgroud)

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

newCol
------
123,456,129
237,438,365
...
Run Code Online (Sandbox Code Playgroud)

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

newCol
------
123
237
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?:(

谢谢你

更新:

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

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

Max*_*axU 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
Run Code Online (Sandbox Code Playgroud)

更新:

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
Run Code Online (Sandbox Code Playgroud)