从 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 数据框列中查找所有正则表达式匹配项的主要内容,如果未能解决你的问题,请参考以下文章