Próbuję wypełnić żadne wartości w ramce danych Pandas z zerami tylko dla niektórych podzbiorów kolumn.
Kiedy robię:
import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df
Wyjście:
a b c
0 1.0 4.0 NaN
1 2.0 5.0 NaN
2 3.0 NaN 7.0
3 NaN 6.0 8.0
a b c
0 1.0 4.0 0.0
1 2.0 5.0 0.0
2 3.0 0.0 7.0
3 0.0 6.0 8.0
Zastępuje każdy None
z 0
. Chcę tylko zamienić None
s w kolumnach a
i b
, ale nie c
.
Jaki jest najlepszy sposób na zrobienie tego?
df[['a', 'b']] = df[['a','b']].fillna(value=0)
nadal będzie działaćinplace
nadal będzie działać na kopii. Nie wiem, czy tak jest,fillna
czy nie. Zobacz odpowiedź jednego z głównych twórców pand.Możesz użyć
dict
,fillna
z inną wartością dla różnych kolumnPo przypisaniu go z powrotem
źródło
fromkeys
jeśli chcesz, +1df.fillna({'a':0,'b':0}, inplace=True)
Możesz uniknąć tworzenia kopii obiektu za pomocą rozwiązania Wen i inplace = True:
Co daje:
źródło
Oto, jak możesz to wszystko zrobić w jednej linii:
Podział:
df[['a', 'b']]
wybiera kolumny, dla których chcesz wypełnić wartości NaN,value=0
mówi mu, aby wypełnić pola NaN zerami iinplace=True
sprawi, że zmiany będą trwałe, bez konieczności wykonywania kopii obiektu.źródło
użycie pierwszej odpowiedzi powoduje wyświetlenie ostrzeżenia o dokonywaniu zmian w kopii wycinka df. Zakładając, że masz inne kolumny, lepszym sposobem na to jest przekazanie słownika:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)
źródło
Lub coś takiego:
a jeśli jest więcej:
źródło
Czasami ta składnia nie działa:
Zamiast tego użyj następujących:
źródło