2013-06-13 11 views
37

Gibt es eine Methode, um Werte in Pandas in Python durch None zu ersetzen?Wie ersetzt man die Werte im Pandas-Datenrahmen in Python durch None?

Sie können df.replace('pre', 'post') verwenden und können einen Wert durch einen anderen ersetzen, aber das kann nicht getan werden, wenn Sie mit None Wert ersetzen möchten, die, wenn Sie versuchen, erhalten Sie ein seltsames Ergebnis.

So, hier ist ein Beispiel:

df = DataFrame(['-',3,2,5,1,-5,-1,'-',9]) 
df.replace('-', 0) 

, die ein erfolgreiches Ergebnis zurückgibt.

Aber

df.replace('-', None) 

, die ein folgendes Ergebnis liefert:

0 
0 - // this isn't replaced 
1 3 
2 2 
3 5 
4 1 
5 -5 
6 -1 
7 -1 // this is changed to `-1`... 
8 9 

Warum so ein komisches Ergebnis zurückgegeben werden?

Da ich diesen Datenrahmen in MySQL-Datenbank gießen möchte, kann ich NaN Werte in kein Element in meinem Datenrahmen setzen und stattdessen None setzen. Sicher können Sie zuerst '-' zu NaN ändern und dann NaN in None umwandeln, aber ich möchte wissen, warum der Datenrahmen auf solch eine schreckliche Weise handelt.

+0

Ist die 'write_frame' parsen nicht' NaN's zu 'none's? –

+0

Yup. Sie begegnen 'InternalError: (1054, u" Unbekannte Spalte 'nan' in 'Feldliste' ")' Fehler. Ich kenne keine anderen Lösungen, als "NaN" in "None" zu konvertieren, bevor "write_frame" ausgeführt wird. – Blaszard

+0

Welche Version von Pandas benutzt du? –

Antwort

51

Eigentlich in späteren Versionen von Pandas wird dies eine Typeerror geben:

df.replace('-', None) 
TypeError: If "to_replace" and "value" are both None then regex must be a mapping 

Sie können es tun, indem entweder eine Liste oder ein Wörterbuch vorbei:

In [11]: df.replace('-', df.replace(['-'], [None]) # or .replace('-', {0: None}) 
Out[11]: 
     0 
0 None 
1  3 
2  2 
3  5 
4  1 
5 -5 
6 -1 
7 None 
8  9 

Aber ich empfehlen NaNs statt keine:

In [12]: df.replace('-', np.nan) 
Out[12]: 
    0 
0 NaN 
1 3 
2 2 
3 5 
4 1 
5 -5 
6 -1 
7 NaN 
8 9 
+7

Oder einfach eine Liste, z.B. 'df.replace (['-'], [None])', oder 'df.replace ({'-': None})', denke ich. Die Verwendung von 'None' als Sentinel schließt die Verwendung als Wert auch aus. – DSM

+0

@DSM oooh viel besser, yoinked! :) –

+0

Das ist großartig. Ich kann mir keine Liste als Argument zuordnen. Vielen Dank! – Blaszard

11

where ist wahrscheinlich das, was Sie suchen. So

data=data.where(data=='-', None) 

Vom panda docs:

where [returns] an object of same shape as self and whose corresponding entries are from self where cond is True and otherwise are from other).

+0

Einfach und präzise! Vielen Dank. – Juan

+3

Dies ist tatsächlich ungenau. data = data.where (data == '-', None) ersetzt alles, was NICHT gleich '-' ist, mit None. Pandas-Version von where behält den Wert des ersten arg (in diesem Fall data == '-') und ersetzt alles andere durch den zweiten arg (in diesem Fall None). Es ist ein wenig verwirrend wie np. wo expliziter ist, dass es die Bedingung im ersten Argument fragt, dann das if im zweiten arg, dann das if false im 3. arg. – clg4