用str.contains忽略NaN

Emr*_*mre 101 python pandas

我想找到包含字符串的行,如下所示:

DF[DF.col.str.contains("foo")]
Run Code Online (Sandbox Code Playgroud)

但是,这会失败,因为有些元素是NaN:

ValueError:无法使用包含NA/NaN值的向量进行索引

所以我诉诸混淆

DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

And*_*den 196

有一个标志:

In [11]: df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

In [12]: df.a.str.contains("foo")
Out[12]:
0     True
1     True
2    False
3      NaN
Name: a, dtype: object

In [13]: df.a.str.contains("foo", na=False)
Out[13]:
0     True
1     True
2    False
3    False
Name: a, dtype: bool
Run Code Online (Sandbox Code Playgroud)

查看str.replace文档:

na:默认NaN,缺失值的填充值.


所以你可以做到以下几点:

In [21]: df.loc[df.a.str.contains("foo", na=False)]
Out[21]:
      a
0  foo1
1  foo2
Run Code Online (Sandbox Code Playgroud)

  • 在这里,我遇到了一种情况,其中 `a` 是从 CSV 填充的,而 `a` 列包含字符串“nan”。`pandas`“智能地”将其转换为 `NaN` 并在我尝试执行 `df.a.str.contains()` 时开始抱怨。所以是的提示:确保在 `read_csv()` 中设置列​​类型,或者之后执行类似 `df = df.where(pandas.notnull(df), "nan")` 之类的操作,哈哈 (3认同)
  • 大声笑为什么不默认? (3认同)

mun*_*ish 11

df[df.col.str.contains("foo").fillna(False)]
Run Code Online (Sandbox Code Playgroud)


Har*_*_pb 6

除了上面的答案,我会说对于没有单个单词名称的列,你可以使用: -

df[df['Product ID'].str.contains("foo") == True]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.