使用IN运算符在pandas.Series中查找字符串

时间:2015-10-29 01:03:37

标签: python pandas

假设我有以下pandas.Series:

import pandas as pd
s = pd.Series([1,3,5,True,6,8,'findme', False])

我可以使用in运算符来查找任何整数或布尔值。例子,以下都产生True:

1 in s
True in s

但是,当我这样做时,这会失败:

'findme' in s

我的解决方法是使用pandas.Series.str或首先将系列转换为列表,然后使用in运算符:

True in s.str.contains('findme')
s2 = s.tolist()
'findme' in s2

我知道为什么我不能直接使用in运算符来查找系列中的字符串?

2 个答案:

答案 0 :(得分:5)

  

知道为什么我不能直接使用in运算符来查找系列中的字符串吗?

将系列视为有序字典而不是列表 - 系列中的成员资格测试属于索引(如字典中的键),而不是值。您可以通过.values属性

访问值
>>> s = pd.Series([1,3,5,True,6,8,'findme', False])
>>> 7 in s
True
>>> 7 in s.values
False
>>> 'findme' in s
False
>>> 'findme' in s.values
True

答案 1 :(得分:0)

您要查找的功能是Series.str.match()

s.str.match('findme').any()

请注意,这是在进行正则表达式匹配,因此它非常可扩展。 (如果不需要完全匹配,则可以使用Series.str.contains()。)

.any()将真假序列折叠为单个值,这是发问者所希望的。

或者,您可以使用更通用的方法Series.isin()进行完全匹配。

s.isin(['findme']).any()

(请注意,您必须将'findme'括在方括号中; isin()需要类似列表的内容。)

在评论中,存在有关找到np.NaN的问题。上面的代码也适用于该示例。

s = pd.Series([1,3,5,True,6,8,'findme', False, np.NaN])

s.isin([np.NaN]).any()

您也可以使用等效的特定Series.isna()方法。

s.isna().any()

s.isin()的优点在于,如果您希望在多种可能的情况下进行匹配,则它与数据类型无关:

s.isin(['findme', np.NaN]).any()