如何确定Pandas列是否包含特定值

Mic*_*ael 120 python pandas

我试图确定Pandas列中是否有一个具有特定值的条目.我试着这样做if x in df['id'].我认为这是有效的,除非我给它一个值,我知道它不在列中,43 in df['id']它仍然返回True.当我对仅包含与缺少的id匹配的条目的数据框进行子集化时df[df['id'] == 43],显然其中没有条目.如何确定Pandas数据框中的列是否包含特定值以及为什么我的当前方法不起作用?(仅供参考,当我在这个问题的答案中使用实现时,我遇到了同样的问题).

And*_*den 138

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
Run Code Online (Sandbox Code Playgroud)

一种选择是查看它是否具有唯一值:

In [21]: s.unique()
Out[21]: array(['a', 'b', 'c'], dtype=object)

In [22]: 'a' in s.unique()
Out[22]: True
Run Code Online (Sandbox Code Playgroud)

或者是一个python集:

In [23]: set(s)
Out[23]: {'a', 'b', 'c'}

In [24]: 'a' in set(s)
Out[24]: True
Run Code Online (Sandbox Code Playgroud)

正如@DSM所指出的那样,它可能更有效(特别是如果你只是为一个值做这个),只需直接使用这些值:

In [31]: s.values
Out[31]: array(['a', 'b', 'c'], dtype=object)

In [32]: 'a' in s.values
Out[32]: True
Run Code Online (Sandbox Code Playgroud)

  • 对于长系列赛,我认为"s.values`中的'a'应该更快. (18认同)
  • 从 pandas 0.24.0 开始,非常不鼓励使用 `s.values` 和 `df.values`。见[这个](https://pandas-dev.github.io/pandas-blog/pandas-extension-arrays.html)。此外,在某些情况下,`s.values` 实际上要慢得多。 (4认同)
  • 我不想知道它是否一定是唯一的,主要是我想知道它是否在那里。 (2认同)
  • @AndyHayden您知道为什么熊猫对于s中的'a'选择检查索引而不是检查序列的值吗?在字典中,他们检查键,但是熊猫系列应该表现得更像列表或数组,不是吗? (2认同)
  • @QusaiAlothman 在系列中既不提供`.to_numpy` 也没有`.array`,所以我不完全确定他们提倡什么替代方案(我没有读到“非常气馁”)。事实上,他们是说 .values 可能不会返回一个 numpy 数组,例如在分类的情况下......但这很好,因为 `in` 仍然可以按预期工作(确实更有效,它是 numpy 数组对应物) (2认同)

小智 59

您可以尝试检查名为“id”的特定列中的特定值“x”

if x in df['id'].values
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么这只有 9 个赞成票...它对速度等有一些影响吗...? (2认同)

ffe*_*ast 20

你也可以使用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
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要为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
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用 [DataFrame.any()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.any.html) 函数: `s.isin([' a']).any()` (4认同)

All*_*ang 17

我做了一些简单的测试:

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)
Run Code Online (Sandbox Code Playgroud)

有趣的是,查找 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)
Run Code Online (Sandbox Code Playgroud)

似乎使用 x.values 是最快的,但也许在大熊猫中有更优雅的方式?

  • 如果您将结果的顺序从小到大更改,那就太好了。干得好! (2认同)

U10*_*ard 7

或使用Series.tolistSeries.any

>>> s = pd.Series(list('abc'))
>>> s
0    a
1    b
2    c
dtype: object
>>> 'a' in s.tolist()
True
>>> (s=='a').any()
True
Run Code Online (Sandbox Code Playgroud)

Series.tolist制作一个关于 a 的列表Series,另一个我只是Series从常规中获取一个布尔值Series,然后检查布尔值中是否有任何Trues Series


Sha*_*ari 7

found = df[df['Column'].str.contains('Text_to_search')]
print(found.count())
Run Code Online (Sandbox Code Playgroud)

found.count()遗嘱中含有的比赛数量

如果为0,则表示在“列”中找不到字符串。

  • 为我工作,但我使用 len(found) 来计算 (4认同)
  • 是的 len(found) 是一个更好的选择。 (3认同)