【问题标题】:Finding a string in pandas.Series using the IN operator使用 IN 运算符在 pandas.Series 中查找字符串
【发布时间】:2016-01-29 00:09:55
【问题描述】:

假设我有以下 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 或先将Series 转换为列表,然后使用in 运算符:

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

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

【问题讨论】:

  • 6 in pd.Series([1,2,6]) 为 False,因此即使是数值也无法按预期工作 :)

标签: python pandas


【解决方案1】:

知道为什么我不能直接使用 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

【讨论】:

  • 有趣的是,如果我先import numpy as np 然后再做s = pd.Series([1,3,5,True,6,8,'findme', False, np.nan]),我通过np.nan in s.values 找不到NaN 但我可以通过np.nan in s.tolist() 找到它。想法?
  • @sedeh: nan 很奇怪,因为nan != nan,所以通常你只能得到nan in (something_which_contains_nan),如果它是相同的,tolist() 重用np.nan。请参阅here,了解我之前对 nan-ish 的回答。
【解决方案2】:

您要查找的函数是Series.str.match()

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

注意这是一个正则表达式匹配,所以它非常可扩展。 (如果不需要完全匹配,可以使用Series.str.contains()。)

.any() 根据提问者的要求将真假系列折叠为单个值。

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

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

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

在 cmets 中,有关于查找 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()

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多