2017-01-13 4 views
2

Ich habe einen Datenrahmen „df“:Pandas - Schnelle Art und Weise Wert 1 zu konvertieren und 0

x 
0 -2 
1 2 
2 -4 
3 2 
4 9 
5 -2 

Ich versuche, einen schnellen Weg zu finden, eine neue Spalte df [ ‚binären‘] zu schaffen, in dem Alle positiven Werte in df ['x'] werden als 1 eingegeben, und negative Werte in df ['x'] werden als 0 in der neuen df ['binary'] - Spalte eingegeben. Der reale Rahmen ist sehr groß, also versuche ich das mit Geschwindigkeit. Jede Hilfe wird geschätzt.

Danke

+2

Wenn es irgendwelche Werte von 0, was mit ihnen geschehen sollte? – TigerhawkT3

+0

sie können 0 sein in der binären Spalte –

+0

Gee, wenn nur ein Weg wäre ... oh, ich weiß nicht .... 'eine Funktion auf eine Spalte anwenden. Bah, das ist nur verrückt reden! –

Antwort

5

assign + gt

df.assign(binary=df.x.gt(0) * 1) 

    x binary 
0 -2  0 
1 2  1 
2 -4  0 
3 2  1 
4 9  1 
5 -2  0 

Wenn die Geschwindigkeit ist, was Ihr nach

df['binary'] = (df.x.values > 0).astype(np.uint8) 

enter image description here

+0

Schön! Danke –

+0

Aus irgendeinem Grund funktionierte Assign nicht, aber nur mit df ['binary'] = df.x.gt (0) * 1 hat den Job gemacht. –

+0

@JeffSaltfist 'assign' aktualisiert das' df' nicht, es erstellt eine neue Kopie mit den zugewiesenen Spalten. Es ist eine stilistische Vorliebe für mich. Meine Antwort sollte elegant sein. Wenn Sie Geschwindigkeit wollen, gibt es noch einen zusätzlichen Schritt, den Sie zusätzlich zu dem, was @ mtd zur Verfügung gestellt hat, unternehmen könnten. – piRSquared

5

@piRS quared Antwort ist gut - einige Wege zu finden, kann dies zu beschleunigen:

$ ipython 
In [1]: import numpy as np, pandas as pd 
In [2]: df = pd.DataFrame({'x': np.random.random(1000000) - 0.5}) 
In [3]: %timeit df['binary'] = df['x'].gt(0).astype(np.short) 
1000 loops, best of 3: 1.74 ms per loop 
In [4]: %timeit df['binary'] = df['x'].gt(0).astype(np.short) 
1000 loops, best of 3: 1.78 ms per loop 

ist schneller für mich als:

$ ipython 
In [1]: import numpy as np, pandas as pd 
In [2]: df = pd.DataFrame({'x': np.random.random(1000000) - 0.5}) 
In [3]: %timeit df.assign(binary=df.x.gt(0)*1) 
100 loops, best of 3: 5.48 ms per loop 
In [4]: %timeit df.assign(binary=df.x.gt(0)*1) 
100 loops, best of 3: 5.54 ms per loop 
+0

10,6 ms pro Schleife im Gegensatz zu 13,1 ms pro Schleife. Auch die andere Version hatte eine große Varianz in Zeiten. Sehr schön! –

Verwandte Themen