2015-05-22 13 views
5

Mam ramkę danych z pustymi komórkami i chciałbym zastąpić te puste komórki NaN. Rozwiązanie zaproponowane wcześniej na tym forum działa, ale tylko wtedy, gdy komórka zawiera spację:DataFame pandy zastępuje puste pola NaN

df.replace(r'\s+',np.nan,regex=True)

Ten kod nie działa, gdy komórka jest pusta. Czy ktoś ma sugestię, aby kod panda zastąpił puste komórki.

Wannes

+1

Spróbuj 'df.replace (r '\ s *' np.nan, regex = True)' – EdChum

+0

Właściwie moja propozycja jest zbyt agresywny, to ustawia wszystkie STR 'NaN' , daj mi chwilę. – EdChum

+0

Myślę, że najłatwiej jest to zrobić w 2 przejściach, które mogą być jednolinijkowe: 'df.replace (r '\ s +', np.nan, regex = True) .replace (' ', np.nan) ' – EdChum

Odpowiedz

6

myślę tu najłatwiej jest zrobić to dwa razy wymienić:

In [117]: 
df = pd.DataFrame({'a':['',' ','asasd']}) 
df 

Out[117]: 
     a 
0  
1  
2 asasd 

In [118]: 
df.replace(r'\s+',np.nan,regex=True).replace('',np.nan) 

Out[118]: 
     a 
0 NaN 
1 NaN 
2 asasd 
+1

Należy pamiętać, że to rozwiązanie nie zawsze działa. W moim przypadku nie działał on w przypadku łańcucha '2015-09-02 06: 13: 40', tzn. Spowodował przekształcenie tej wartości na NaN (podczas gdy nie miało to się zdarzyć). Sprawdź więcej znaków w ciągu znaków: '.replace (r '\ s + (+ \.) | #', Np.nan, regex = True) .replace ('', np.nan))' – Guido

0

Jak chodzi?

df.replace(r'\s+|^$', np.nan, regex=True) 
3

Obie pozostałe odpowiedzi nie uwzględniają wszystkich znaków w ciągu znaków. To jest lepsze:

df.replace(r'\s+(+\.)|#',np.nan,regex=True).replace('',np.nan))

Więcej docs na: Replacing blank values (white space) with NaN in pandas

+0

Co '' + \.) | # 'zrobić? Działa świetnie, przy okazji, – Plasma

+0

po prostu ciekawy, dlaczego używasz '| #'? to zastąpiło wszystkie kolory heksadecymalne w moim df: '# 000000' z NaN. to nie tak, że są komentarze w df ... jest bardziej prawdopodobne, że są kolory dla działek. –

0

Jak już widzieliśmy, jeśli nie rzeczą oczywistą i zastąpić() z Żaden zgłasza błąd:

df.replace('', None) 
TypeError: cannot replace [''] with method pad on a DataFrame 

Rozwiązaniem wydaje się po prostu zamiana pustego ciągu na NaN numpy.

import numpy as np 
df.replace('', np.NaN) 

Chociaż nie jestem w 100% pewien, że pd.NaN jest traktowany w taki sam sposób, jak we wszystkich przypadkach np.NaN brzegowych, nie miałem żadnych problemów. fillna() działa, trwające NULL do bazy danych w miejsce np.NaN działa, trwające NaN do prac CSV.

(Pandy wersja 18.1)

Powiązane problemy