NaN'leri str.contains ile yok saymak


118

Dize içeren satırları şu şekilde bulmak istiyorum:

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

Ancak, bazı öğeler NaN olduğundan bu başarısız olur:

ValueError: NA / NaN değerlerini içeren vektörle dizine eklenemez

Bu yüzden şaşkınlığa başvuruyorum

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

Daha iyi bir yol var mı?

Yanıtlar:


227

Bunun için bir bayrak var:

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.replaceDokümanlara bakın :

na: varsayılan NaN, eksik değerler için doldurma değeri.


Böylece şunları yapabilirsiniz:

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

2
Burada abir CSV'den doldurulan bir durum vardı ve asütun "nan" dizesini içeriyordu. pandasBunu "akıllıca" olarak değiştirdi NaNve yapmaya çalıştığımda şikayet etmeye başladım df.a.str.contains(). Öyleyse evet protip: sütun türünü ayarladığınızdan read_csv()veya daha sonra df = df.where(pandas.notnull(df), "nan")LOL gibi bir şey yaptığınızdan emin olun
dmn

Neden df.locve sadece değil df?
PascalVKooten

@PascalVKooten ya iyi, ilike .loc çünkü imo biraz daha açık.
Andy Hayden

1
Beni kurtardın ... eğer burada olmasaydı, kafamı duvara çarparak iki haftalık bir kabustan geçerdim :-) kesinlikle +1 değerinde, lol
U10-İleri

5
Lol neden bu varsayılan değil?
ifly6

8

Yukarıdaki cevaplara ek olarak, tek kelime adı olmayan sütunlar için şunu kullanabilirsiniz: -

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

Bu yardımcı olur umarım.


0

Nedenini% 100 bilmiyorum (aslında cevabı aramak için buraya geldim), ama bu da işe yarıyor ve tüm nan değerlerinin değiştirilmesini gerektirmiyor.

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]

İle veya onsuz çalışır .loc.

Bunun neden işe yaradığına dair hiçbir fikrim yok, anladığım kadarıyla pandalar köşeli parantezin içindekileri ya ya Trueda olarak değerlendiriyor False. Parantez içindeki 'ekstra boole' ifadesini oluşturmanın neden herhangi bir etkisi olduğunu anlayamıyorum.



0

DF [DF.col.str.contains ( "foo"). Fillna (Yanlış)]


-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]

Bu bir cevap değil.
ifly6
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.