str.containsでNaNを無視する


117

次のように、文字列を含む行を検索したい:

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

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

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

だから私は難読化された

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

もっと良い方法はありますか?

回答:


226

そのためのフラグがあります:

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

2
ここでa、CSVからデータが入力されa、列に文字列「nan」が含まれる状況がありました。 pandas「インテリジェントに」これをに変換しNaN、私がしようとしたときに不平を言い始めましたdf.a.str.contains()。だからええ、プロチップ:列タイプを設定するread_csv()か、後でdf = df.where(pandas.notnull(df), "nan")LOLのようなことをしてください
dmn

なぜdf.locだけではなくdf
PascalVKooten 2018

@PascalVKootenはどちらかで問題ありません。ilocは少し明示的であるため、.locと同様です。
アンディヘイデン

1
Yaが私を救った...これがここになかったら、私は2週間の悪夢を乗り越えて頭を壁にぶつけたと思います:-)間違いなく+1の価値がありますlol
U10-Forward

5
笑なぜこれがデフォルトではないのですか?
ifly6

8

上記の回答に加えて、単一の単語名がない列については、次のように使用できます。

df[df['Product ID'].str.contains("foo") == True]

お役に立てれば。


0

理由は100%ではありませんが(実際に答えを探すためにここに来ました)、これも機能し、すべてのnan値を置き換える必要はありません。

import pandas as pd
import numpy as np

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

newdf = df.loc[df['a'].str.contains('foo') == True]

の有無にかかわらず動作し.locます。

ブラケットでインデックスを作成しているときに理解できるので、これが機能する理由はわかりません。パンダは、ブラケット内のすべてをTrueまたはとして評価しますFalse。括弧内に「余分なブール値」というフレーズを作成しても効果がないのはなぜかわかりません。



-3
import folium
import pandas

data= pandas.read_csv("maps.txt")

lat = list(data["latitude"])
lon = list(data["longitude"])

map= folium.Map(location=[31.5204, 74.3587], zoom_start=6, tiles="Mapbox Bright")

fg = folium.FeatureGroup(name="My Map")

for lt, ln in zip(lat, lon):
c1 = fg.add_child(folium.Marker(location=[lt, ln], popup="Hi i am a Country",icon=folium.Icon(color='green')))

child = fg.add_child(folium.Marker(location=[31.5204, 74.5387], popup="Welcome to Lahore", icon= folium.Icon(color='green')))

map.add_child(fg)

map.save("Lahore.html")


Traceback (most recent call last):
  File "C:\Users\Ryan\AppData\Local\Programs\Python\Python36-32\check2.py", line 14, in <module>
    c1 = fg.add_child(folium.Marker(location=[lt, ln], popup="Hi i am a Country",icon=folium.Icon(color='green')))
  File "C:\Users\Ryan\AppData\Local\Programs\Python\Python36-32\lib\site-packages\folium\map.py", line 647, in __init__
    self.location = _validate_coordinates(location)
  File "C:\Users\Ryan\AppData\Local\Programs\Python\Python36-32\lib\site-packages\folium\utilities.py", line 48, in _validate_coordinates
    'got:\n{!r}'.format(coordinates))
ValueError: Location values cannot contain NaNs, got:
[nan, nan]

これは答えではありません。
ifly6
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.