1. ホーム
  2. python

[解決済み】 str.containsでNaNを無視する。

2022-02-07 19:58:47

質問

次のような文字列を含む行を探したい。

DF[DF.col.str.contains("foo")]

しかし、一部の要素がNaNであるため、これは失敗する。

ValueError: NA / NaN 値を含むベクトルでインデックスを作成できません。

そこで、私は難読化された

DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]

もっといい方法はないのでしょうか?

どのように解決するのですか?

そのためのフラグがあるんです。

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

をご覧ください。 str.replace のドキュメントを参照してください。

na : デフォルトのNaN、欠損値には値を埋める。


ということは、次のようにすればいいんですね。

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