Answers:
in
系列的值检查值是否在索引中:
In [11]: s = pd.Series(list('abc'))
In [12]: s
Out[12]:
0 a
1 b
2 c
dtype: object
In [13]: 1 in s
Out[13]: True
In [14]: 'a' in s
Out[14]: False
一种选择是查看它是否具有唯一值:
In [21]: s.unique()
Out[21]: array(['a', 'b', 'c'], dtype=object)
In [22]: 'a' in s.unique()
Out[22]: True
或python集:
In [23]: set(s)
Out[23]: {'a', 'b', 'c'}
In [24]: 'a' in set(s)
Out[24]: True
正如@DSM所指出的那样,直接在这些值上使用可能会更有效(尤其是如果您只对一个值执行此操作):
In [31]: s.values
Out[31]: array(['a', 'b', 'c'], dtype=object)
In [32]: 'a' in s.values
Out[32]: True
'a' in s.values
长系列应该更快。
'a' in s
熊猫会选择检查索引而不是系列值吗?在字典中,他们检查键,但是熊猫系列应该表现得更像列表或数组,不是吗?
.to_numpy
或者.array
在系列中都没有,所以我不能完全确定他们在倡导哪种选择(我不读“强烈劝阻”)。实际上,他们是说.values可能不会返回numpy数组,例如在分类的情况下... ...那样很好,因为它in
仍然可以按预期工作(实际上是与numpy数组相对应)
您也可以使用pandas.Series.isin,尽管它比'a' in s.values
以下内容长一些:
In [2]: s = pd.Series(list('abc'))
In [3]: s
Out[3]:
0 a
1 b
2 c
dtype: object
In [3]: s.isin(['a'])
Out[3]:
0 True
1 False
2 False
dtype: bool
In [4]: s[s.isin(['a'])].empty
Out[4]: False
In [5]: s[s.isin(['z'])].empty
Out[5]: True
但是,如果您需要一次为一个DataFrame匹配多个值,则这种方法可以更加灵活(请参阅DataFrame.isin)
>>> df = DataFrame({'A': [1, 2, 3], 'B': [1, 4, 7]})
>>> df.isin({'A': [1, 3], 'B': [4, 7, 12]})
A B
0 True False # Note that B didn't match 1 here.
1 False True
2 True True
s.isin(['a']).any()
found = df[df['Column'].str.contains('Text_to_search')]
print(found.count())
在found.count()
遗嘱中含有的比赛数量
如果为0,则表示在“列”中找不到字符串。
我做了一些简单的测试:
In [10]: x = pd.Series(range(1000000))
In [13]: timeit 999999 in x.values
567 µs ± 25.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [15]: timeit x.isin([999999]).any()
9.54 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [16]: timeit (x == 999999).any()
6.86 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [17]: timeit 999999 in set(x)
79.8 ms ± 1.98 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [21]: timeit x.eq(999999).any()
7.03 ms ± 33.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [22]: timeit x.eq(9).any()
7.04 ms ± 60 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [24]: timeit 9 in x.values
666 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
有趣的是,查找9还是999999都没有关系,使用in语法似乎需要花费相同的时间(必须使用二进制搜索)
In [24]: timeit 9 in x.values
666 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [25]: timeit 9999 in x.values
647 µs ± 5.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [26]: timeit 999999 in x.values
642 µs ± 2.11 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [27]: timeit 99199 in x.values
644 µs ± 5.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [28]: timeit 1 in x.values
667 µs ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
似乎使用x.values最快,但是在熊猫中也许有更优雅的方式吗?
用
df[df['id']==x].index.tolist()
如果x
存在,id
则返回存在的索引列表,否则给出一个空列表。
我不建议使用“串联值”,否则可能导致许多错误。请查看此答案以获取详细信息:在Pandas系列中与运算符一起使用
假设您的数据框看起来像:
现在,您要检查数据帧中是否存在文件名“ 80900026941984”。
您可以简单地写:
if sum(df["filename"].astype("str").str.contains("80900026941984")) > 0:
print("found")