2015-02-04 31 views
36

vorrei trovare le righe che contengono una stringa, in questo modo:Ignorando NaNs con str.contains

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

Tuttavia, questo non riesce perché alcuni elementi sono NaN:

ValueError: cannot index with vector containing NA/NaN values

Così ho ricorrere a l'offuscato

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

C'è un modo migliore?

risposta

62

C'è una bandiera per questo:

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 

Vedi le str.replace documentazione:

na : default NaN, fill value for missing values.


Così si può fare quanto segue:

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

oh bel uomo – swyx

+1

Qui ho avuto una situazione in cui 'a' era popolato da un CSV, e la colonna' a' conteneva la stringa "nan". 'pandas'" intelligentemente "ha convertito questo in' NaN' e ha iniziato a lamentarsi quando ho provato a fare 'df.a.str.contains()'. Quindi sì protip: assicurati di impostare il tipo di colonna in 'read_csv()' o dopo fai qualcosa come 'df = df.where (pandas.notnull (df)," nan ")' LOL – dmn

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

Oltre alle risposte di cui sopra, direi per le colonne che non hanno singolo nome parola, si possono utilizzare: -

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

Spero che questo aiuti.