假设我有以下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
运算符来查找系列中的字符串?
答案 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()