Pandas 存在字符串时,dataframe 报告没有匹配的字符串

Pandas dataframe reports no matching string when the string is present

python 相当陌生。这似乎是一个非常简单的问题,但我找不到有关它的任何信息。 我有一个字符串列表,对于每个字符串,我想检查它是否存在于数据帧中(实际上是在数据帧的特定列中。不是是否存在子字符串,而是整个字符串。

所以我的数据框如下所示:

A=pd.DataFrame(["ancestry","time","history"])

我应该能够简单地使用“数据框中的字符串”方法,如

"time" in A

这个returns不过是假的。 如果我运行

"time" == A.iloc[1]

它 returns “正确”,但作为系列的一部分很烦人,这取决于知道相应字符串在数据帧中的位置。 有什么方法可以只使用 df 方法中的字符串,轻松找出列表中的字符串是否在数据框中?

处理这个问题的方法是将整个数据帧与 "time" 进行比较。这将 return 一个掩码,其中 DF 的每个值如果是 time 则为 True,否则为 False。然后,您可以使用 .any() 检查是否有任何 True 值:

>>> A = pd.DataFrame(["ancestry","time","history"])
>>> A
          0
0  ancestry
1      time
2   history

>>> A == "time"  # or A.eq("time")
       0
0  False
1   True
2  False

>>> (A == "time").any()
0    True
dtype: bool

注意上面的输出,(A == "time").any() return 是一个系列,其中每个条目都是一列,并且该列是否包含 time。如果你想检查整个数据框(跨所有列),调用.any()两次:

>>> (A == "time").any().any()
True

我相信(myseries==mystr).any()会按照您的要求去做。 DataFrames 的特殊 __contains__ 方法(通知 in 的行为)检查您的字符串是否是 DataFrame 的列,例如

>>> A = pd.DataFrame({"c": [0,1,2], "d": [3,4,5]})
>>> 'c' in A
True
>>> 0 in A
False

最后加上.to_numpy()

'time' in A.to_numpy() 

如您所见,x in pandas.DataFrame 语法不会产生您想要的结果。但是 .to_numpy() 将数据帧转换为 Numpy 数组,并且 x in numpy.array 如您所愿。

我会稍微修改您的数据框并使用 .str.contains 检查字符串在您的系列中的位置。

df=pd.DataFrame()
df['A']=pd.Series(["ancestry","time","history"])

df['A'].str.contains("time")