Ignorieren von NaNs mit str.contains

117

Ich möchte Zeilen finden, die eine Zeichenfolge enthalten, wie folgt:

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

Dies schlägt jedoch fehl, da einige Elemente NaN sind:

ValueError: Kann nicht mit einem Vektor indizieren, der NA / NaN-Werte enthält

Also greife ich auf das Verschleierte zurück

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

Gibt es einen besseren Weg?

Emre
quelle

Antworten:

226

Dafür gibt es eine Flagge:

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

Siehe die str.replaceDokumente:

na: Standard NaN, Füllwert für fehlende Werte.


Sie können also Folgendes tun:

In [21]: df.loc[df.a.str.contains("foo", na=False)]
Out[21]:
      a
0  foo1
1  foo2
Andy Hayden
quelle
2
Hier hatte ich eine Situation, in der aeine CSV-Datei vorhanden war und die aSpalte die Zeichenfolge "nan" enthielt. pandas"intelligent" wandelte dies um NaNund begann sich zu beschweren, als ich es versuchte df.a.str.contains(). Also ja, Protip: Stellen Sie sicher, dass Sie den Spaltentyp einstellen read_csv()oder danach etwas wie df = df.where(pandas.notnull(df), "nan")LOL tun
dmn
Warum df.locund nicht nur df?
PascalVKooten
@PascalVKooten ist entweder in Ordnung, wie .loc, da es imo etwas expliziter ist.
Andy Hayden
1
Du hast mich gerettet ... wenn das nicht hier wäre, hätte ich wahrscheinlich einen Albtraum von zwei Wochen durchgemacht, in dem ich meinen Kopf gegen die Wand geschlagen habe :-) definitiv einen Wert von +1, lol
U10-Forward
5
Lol warum ist das nicht Standard?
ifly6
8

Zusätzlich zu den obigen Antworten würde ich sagen, dass Sie für Spalten, die keinen einzelnen Wortnamen haben, Folgendes verwenden können:

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

Hoffe das hilft.

Harry_pb
quelle
0

Ich weiß nicht zu 100% warum (bin tatsächlich hierher gekommen, um nach der Antwort zu suchen), aber das funktioniert auch und erfordert nicht das Ersetzen aller Nanowerte.

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]

Funktioniert mit oder ohne .loc.

Ich habe keine Ahnung, warum dies funktioniert, da ich es verstehe, wenn Sie mit Klammern indizieren. Pandas bewertet alles, was sich in der Klammer befindet, als entweder Trueoder False. Ich kann nicht sagen, warum das Setzen der Phrase in den Klammern "extra boolean" überhaupt einen Effekt hat.

Nate Taylor
quelle
0

Sie können auch patern:

DF[DF.col.str.contains(pat = '(foo)', regex = True) ]
Aliakbar Hosseinzadeh
quelle
-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]
Faheem Alvi
quelle
Dies ist keine Antwort.
ifly6