在包含字符串列表的Series上使用Pandas字符串方法'contains'

时间:2014-12-04 17:20:15

标签: python regex string pandas

给出一个简单的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单独检查每一行中的每个元素以匹配特定的正则表达式模式并相应地创建一个新的Series,它存储返回的布尔值,每个都表示是否正则表达式在至少一个列表元素上匹配。

我希望有类似的东西:

In:
s.str.contains('you')

Out:
0   False
1   True
2   False

< - 第0行在其任何元素中都不包含'you',但第1行包含0 NaN 1 NaN 2 NaN dtype: float64 ,而第2行则不包含result = [[x.str.contains('you') for x in y] for y in s] AttributeError: 'str' object has no attribute 'str'

但是,在执行上述操作时,返回

{{1}}

我还尝试了一个列表理解,它不起作用:

{{1}}

有关如何实现这一目标的任何建议?

1 个答案:

答案 0 :(得分:5)

你可以使用python find()方法

>>> 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