Chcę znaleźć wiersze zawierające ciąg, na przykład:
DF[DF.col.str.contains("foo")]
Jednak to się nie udaje, ponieważ niektóre elementy są NaN:
Błąd wartości: nie można indeksować wektorem zawierającym wartości NA / NaN
Więc uciekam się do zaciemnionego
DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
Czy jest lepszy sposób?
a
został wypełniony z pliku CSV, aa
kolumna zawierała ciąg „nan”.pandas
„inteligentnie” przekonwertował to naNaN
i zacząłem narzekać, kiedy próbowałem to zrobićdf.a.str.contains()
. Więc tak, protip: upewnij się, że ustawiłeś typ kolumnyread_csv()
lub później zrób coś takiego jakdf = df.where(pandas.notnull(df), "nan")
LOLdf.loc
i nie tylkodf
?Oprócz powyższych odpowiedzi, powiedziałbym, że dla kolumn bez nazwy jednego słowa można użyć: -
Mam nadzieję że to pomoże.
źródło
Nie wiem w 100% dlaczego (w rzeczywistości przyszedłem tutaj, aby szukać odpowiedzi), ale to również działa i nie wymaga zastępowania wszystkich wartości nan.
Działa z lub bez
.loc
.Nie mam pojęcia, dlaczego to działa, ponieważ rozumiem, że podczas indeksowania w nawiasach pandy ocenia to, co znajduje się w nawiasie jako albo
True
alboFalse
. Nie potrafię powiedzieć, dlaczego ustawienie wyrażenia w nawiasach jako „extra boolean” ma jakikolwiek wpływ.źródło
Możesz również paternować:
źródło
DF [DF.col.str.contains ("foo"). Fillna (fałsz)]
źródło
źródło