Wie alle Nicht-NaN-Einträge eines Datenrahmens durch 1 und alle NaN durch 0 ersetzt werden

8

Ich habe einen Datenrahmen mit 71 Spalten und 30597 Zeilen. Ich möchte alle nicht-nan Einträge durch 1 und die Nan Werte durch 0 ersetzen.

Zuerst habe ich for-loop für jeden Wert des Datenrahmens versucht, der zu viel Zeit in Anspruch genommen hat.

Dann habe ich data_new = data subtract (data) verwendet, was dazu gedacht war, alle Werte des Datenrahmens von sich selbst abzuziehen, so dass ich alle Nicht-Null-Werte auf 0 setzen kann. Es trat jedoch ein Fehler auf, da der Datenrahmen mehrere Zeichenfolgeneinträge enthielt.

    
Anirban De 31.05.2016, 10:50
quelle

6 Antworten

9

Sie können den Rückgabewert von df.notnull() , das ist False , wobei der DataFrame NaN und True enthält, und den Wert in Ganzzahl umwandeln, wodurch Sie 0 erhalten, wobei der Datenrahmen NaN und ist 1 andernfalls:

%Vor%

Wenn Sie wirklich in Ihren ursprünglichen DataFrame schreiben möchten, funktioniert dies:

%Vor%     
fmarc 31.05.2016 10:54
quelle
4

Verwenden Sie notnull mit dem Casting boolean auf int von astype :

%Vor%

Beispiel:

%Vor%     
jezrael 31.05.2016 10:53
quelle
2

Ich mache viele Datenanalysen und bin daran interessiert, neue / schnellere Methoden zur Durchführung von Operationen zu finden. Ich war nie auf die Methode von Jezrael gestoßen, also war ich neugierig, sie mit meiner üblichen Methode zu vergleichen (d. H. Durch Indexierung ersetzen). HINWEIS: Dies ist keine Antwort auf die Frage des OP, sondern es ist eine Illustration der Effizienz der Jezrael-Methode. Da dies keine Antwort ist, werde ich diesen Beitrag entfernen, wenn die Leute ihn nicht nützlich finden (und nachdem er in Vergessenheit geraten ist!). Hinterlasse einen Kommentar, wenn du denkst, ich sollte ihn entfernen.

Ich habe einen mittelgroßen Datenrahmen erstellt und mehrere Ersetzungen sowohl mit der Methode df.notnull (). astype (int) als auch mit der einfachen Indexierung (wie würde ich das normalerweise machen) durchgeführt. Es stellt sich heraus, dass das Letztere ungefähr fünfmal langsamer ist. Nur ein Trick für jeden, der größeren Ersatz tut.

%Vor%

Dies ergibt Zeiten von 0,142 s bzw. 0,685 s. Es ist klar, wer der Gewinner ist.

    
tnknepp 31.05.2016 12:24
quelle
0

Ich würde empfehlen, eine neue Spalte zu erstellen, anstatt nur zu ersetzen. Sie können die vorherige Spalte jederzeit löschen, aber es ist immer hilfreich, eine Quelle für eine Spalte zu haben, die über eine Operation in einer anderen Spalte gefüllt wird.

z.B. wenn df ['col1'] die vorhandene Spalte ist

%Vor%

wobei Spalte2 die neue Spalte ist. Sollte auch funktionieren wenn Col2 String-Einträge hat.

    
tompiler 31.05.2016 10:59
quelle
0

Verwenden Sie: df.fillna(0)

um NaN mit 0 zu füllen.

    
afuc func 31.05.2016 11:02
quelle
0

Es gibt eine Methode .fillna() auf DataFrames, die dies tut was du brauchst. Zum Beispiel:

%Vor%

oder

%Vor%     
DainDwarf 31.05.2016 10:58
quelle

Tags und Links