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

新手上路,请多包涵

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

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

Series 的 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 可能更有效(特别是如果您只是为一个值执行此操作):

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

In [32]: 'a' in s.values
Out[32]: True

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 3.0 许可协议

您也可以使用 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

原文由 ffeast 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题