Chcę znaleźć wszystkie wartości w ramce danych Pandas, które zawierają białe znaki (dowolną ilość) i zastąpić te wartości NaN.
Jakieś pomysły, jak można to poprawić?
Zasadniczo chcę to zmienić:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
Zaangażowany w to:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
Udało mi się to zrobić z poniższym kodem, ale stary czy to brzydkie. To nie jest Pythonic i jestem pewien, że nie jest to również najbardziej efektywne wykorzystanie pand. Przechodzę w pętli przez każdą kolumnę i zastępuję wartość logiczną względem maski kolumny wygenerowanej przez zastosowanie funkcji, która wyszukuje wyrażenia regularne każdej wartości, dopasowując je do białych znaków.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Można go nieco zoptymalizować, przechodząc tylko przez pola, które mogą zawierać puste ciągi:
if df[i].dtype == np.dtype('object')
Ale to nie jest duża poprawa
I wreszcie, ten kod ustawia ciągi docelowe na None, co działa z takimi funkcjami Pandy, jak fillna()
, ale byłoby miło dla kompletności, gdybym mógł wstawić NaN
bezpośrednio zamiast None
.
replace
z wyrażeniem regularnym ... (być może powinno to być wymagane jako funkcja).