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?

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

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.


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.



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

Dies ist keine Antwort.
ifly6
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.