2015-05-22 21 views
5

Ich habe einen Datenrahmen mit leeren Zellen und möchte diese leeren Zellen durch NaN ersetzen. Eine Lösung, die zuvor in diesem Forum vorgeschlagen funktioniert, aber nur, wenn die Zelle enthält ein Leerzeichen:Pandas Dataframe ersetzen Leerzeichen mit NaN

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

Dieser Code funktioniert nicht, wenn die Zelle leer ist. Hat jemand einen Vorschlag für einen Panda-Code, um leere Zellen zu ersetzen.

Wannes

+1

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

+0

Eigentlich ist mein Vorschlag zu aggressiv, setzt dies alles str 'NaN' Geben Sie mir einen Moment – EdChum

+0

Ich denke, die einfachste Sache ist es, dies in 2 Durchgängen zu tun, die ein Einzeiler sein können: 'df.replace (r '\ s +', np.nan, regex = True) .replace (' ', np.nan) ' – EdChum

Antwort

6

Ich denke, die einfachste Sache hier ist doppelt so ersetzen zu tun:

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

Bitte beachten Sie, dass diese Lösung nicht immer funktioniert. In meinem Fall funktionierte es nicht für die Zeichenfolge "2015-09-02 06: 13: 40", d. H. Es führte dazu, dass dieser Wert in NaN umgewandelt wurde (obwohl das nicht geschehen sollte). Suchen Sie nach weiteren Zeichen in der Zeichenfolge: '.replace (r '\ s + (+ \.) | #', Np.nan, regex = True) .replace ('', np.nan))' – Guido

0

Wie wäre das?

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

Beide anderen Antworten berücksichtigen nicht alle Zeichen in einer Zeichenfolge. Das ist besser:

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

Weitere Dokumentationen zu: Replacing blank values (white space) with NaN in pandas

+0

Was bedeutet '(+ \.) | # 'tun? Funktioniert super, übrigens – Plasma

+0

nur neugierig, warum benutzen Sie '| #'? Dies ersetzt alle Hex-Farben in meinem df: '# 000000' mit NaN. Es ist nicht so, dass es Kommentare in einem DF gibt ... es ist wahrscheinlicher, dass es Farben für Plots gibt. –

0

Wie Sie bereits gesehen haben, wenn Sie die offensichtliche Sache zu tun und ersetzen() mit None er einen Fehler wirft:

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

Die Lösung scheint einfach die leere Zeichenfolge durch numpy NaN zu ersetzen.

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

Während ich nicht 100% sicher bin, dass pd.NaN auf genau die gleiche Art und Weise wie np.NaN über alle Grenzfälle behandelt wird, habe ich keine Probleme gehabt. fillna() funktioniert, persistent NULL auf die Datenbank anstelle von np.NaN funktioniert, persistent NaN zu csv funktioniert.

(Pandas Version 18.1)