在包含字符串列表的系列上使用 Pandas 字符串方法“包含”
Posted
技术标签:
【中文标题】在包含字符串列表的系列上使用 Pandas 字符串方法“包含”【英文标题】:Use Pandas string method 'contains' on a Series containing lists of strings 【发布时间】:2015-02-02 16:32:45 【问题描述】:给定一个简单的 Pandas 系列,其中包含一些可以由多个句子组成的字符串:
In:
import pandas as pd
s = pd.Series(['This is a long text. It has multiple sentences.','Do you see? More than one sentence!','This one has only one sentence though.'])
Out:
0 This is a long text. It has multiple sentences.
1 Do you see? More than one sentence!
2 This one has only one sentence though.
dtype: object
我使用 pandas 字符串方法 split
和正则表达式模式将每一行拆分为单个句子(这会产生不必要的空列表元素 - 有关如何改进正则表达式的任何建议?)。
In:
s = s.str.split(r'([A-Z][^\.!?]*[\.!?])')
Out:
0 [, This is a long text., , It has multiple se...
1 [, Do you see?, , More than one sentence!, ]
2 [, This one has only one sentence though., ]
dtype: object
这会将每一行转换为字符串列表,每个元素包含一个句子。
现在,我的目标是使用字符串方法contains
分别检查每一行中的每个元素以匹配特定的正则表达式模式并相应地创建一个新的系列来存储返回的布尔值,每个都表示正则表达式是否匹配至少有一个列表元素。
我希望是这样的:
In:
s.str.contains('you')
Out:
0 False
1 True
2 False
'you',但第 1 行包含,而第 2 行不包含。
但是,当执行上述操作时,返回是
0 NaN
1 NaN
2 NaN
dtype: float64
我还尝试了一个不起作用的列表理解:
result = [[x.str.contains('you') for x in y] for y in s]
AttributeError: 'str' object has no attribute 'str'
关于如何实现这一点的任何建议?
【问题讨论】:
【参考方案1】:你可以使用pythonfind()
方法
>>> s.apply(lambda x : any((i for i in x if i.find('you') >= 0)))
0 False
1 True
2 False
dtype: bool
我猜s.str.contains('you')
不起作用,因为您的系列元素不是字符串,而是列表。但你也可以这样做:
>>> s.apply(lambda x: any(pd.Series(x).str.contains('you')))
0 False
1 True
2 False
【讨论】:
万岁,谢谢!不过,在我的情况下,我更喜欢后者,因为contains
允许您使用正则表达式进行搜索,而find
需要一个字符串。然而,在简单的情况下,当不需要正则表达式时,我猜 find 可能会更快。
@Dirk,以防万一-您可以使用re
模块通过正则表达式查找-docs.python.org/2/library/re.html#module-re以上是关于在包含字符串列表的系列上使用 Pandas 字符串方法“包含”的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 使用 for 循环在部分字符串匹配上设置列:使用包含 NaN 的向量进行错误索引