2014-04-09 11 views
33

Was ist der beste Weg, um eine Null gefüllt Pandas Datenrahmen einer bestimmten Größe zu erstellen?Erstellen eines Null-gefüllten Pandas Datenrahmens

zero_data = np.zeros(shape=(len(data),len(feature_list))) 
d = pd.DataFrame(zero_data, columns=feature_list) 

Gibt es einen besseren Weg, es zu tun:

ich verwendet habe?

+1

Nein, ich kann nicht glauben, von einer wesentlichen Verbesserung auf dem. –

+0

Ich bekomme einen Speicherfehler auf np.zeros, da die Daten eine große Menge sind. Irgendwelche Hinweise darauf, was ich tun kann? Ich habe außer "MemoryError" keine andere Ausgabe. Ich habe 100 GB RAM und die Daten sind nur 20 GB, aber immer noch fehlgeschlagen. Keine Ahnung, wie es zu debuggen, 64-Bit-Ubuntu-Server. Ich habe ein bisschen gegoogelt, aber jeder sagt - Teile in Stücke, aber diese Daten können nicht geteilt werden. – niedakh

+0

Können Sie nur mit 'Daten' arbeiten? Warum musst du eine andere Struktur erstellen, um es zu halten? –

Antwort

53

Sie können dies versuchen:

d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list) 
+1

Dies zu testen Ich finde '% Zeit Temp = np.zeros ((10, 11)); d = pd.DataFrame (temp, spalten = ['col1', 'col2', ... 'col11']) 'dauert 156 us. Aber '% timeit d = pd.DataFrame (0, index = np.arange (10), Spalten = ['col1', 'col2', ... 'col11'])' dauert 171 us. Ich bin überrascht, dass es nicht schneller ist. – emschorsch

+0

Beachten Sie, dass Sie möglicherweise in Int/Float Problem auftreten, wenn Sie etwas wie 'd.set_value (params)' nach der Initialisierung von "d" tun, um Nullen zu enthalten. Eine einfache Lösung ist: 'd = pd.DataFrame (0.0, index = np.arange (len (data)), columns = feature_list)'. – ximiki

0

Wenn Sie bereits einen Datenrahmen haben, ist dies der schnellste Weg:

In [1]: columns = ["col{}".format(i) for i in range(10)] 
In [2]: orig_df = pd.DataFrame(np.ones((10, 10)), columns=columns) 
In [3]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns) 
10000 loops, best of 3: 60.2 µs per loop 

vergleichen:

In [4]: %timeit d = pd.DataFrame(0, index = np.arange(10), columns=columns) 
10000 loops, best of 3: 110 µs per loop 

In [5]: temp = np.zeros((10, 10)) 
In [6]: %timeit d = pd.DataFrame(temp, columns=columns) 
10000 loops, best of 3: 95.7 µs per loop 
1

eine Vorlage mit der Annahme DataFrame, das man hier mit Nullwerten kopieren möchte ...

Wenn Sie keine NaNs in Ihrem Datensatz haben, können durch Null multipliziert wird deutlich schneller:

In [19]: columns = ["col{}".format(i) for i in xrange(3000)]                      

In [20]: indices = xrange(2000) 

In [21]: orig_df = pd.DataFrame(42.0, index=indices, columns=columns) 

In [22]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns) 
100 loops, best of 3: 12.6 ms per loop 

In [23]: %timeit d = orig_df * 0.0 
100 loops, best of 3: 7.17 ms per loop 

Verbesserung hängt von Datenrahmen Größe, fand aber nie langsamer.

Und nur für das Heck von ihm:

In [24]: %timeit d = orig_df * 0.0 + 1.0 
100 loops, best of 3: 13.6 ms per loop 

In [25]: %timeit d = pd.eval('orig_df * 0.0 + 1.0') 
100 loops, best of 3: 8.36 ms per loop 

Aber:

In [24]: %timeit d = orig_df.copy() 
10 loops, best of 3: 24 ms per loop 

EDIT !!!

Vorausgesetzt, Sie haben einen Rahmen mit float64, wird dies mit Abstand der schnellste sein! Es ist auch in der Lage, einen beliebigen Wert zu erzeugen, indem 0.0 zu der gewünschten Füllnummer ersetzt wird.

In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0') 
100 loops, best of 3: 3.68 ms per loop 

Je nach Geschmack kann man von außen definieren nan, und tut eine allgemeine Lösung, unabhängig vom jeweiligen Typ float:

In [39]: nan = np.nan 
In [40]: %timeit d = pd.eval('orig_df > nan + 0.0') 
100 loops, best of 3: 4.39 ms per loop 
+1

Dies ist definitiv die umfassendste Antwort auf Timing, obwohl für das OP scheint, dass Speicheranforderungen das Problem und nicht Geschwindigkeit waren ... Übrigens, auf meinem System geben die ersten beiden Vorschlag Sie das gleiche Timing (Pandas 0,20. 3), also vielleicht gab es einige Änderungen. – Moot

9

Es ist am besten, dies meiner Meinung nach mit numpy zu tun

import numpy as np 
d = pd.DataFrame(np.zeros((N_rows, N_cols))) 
+0

Wenn ich es so gemacht habe, konnte ich die "0" -Werte nicht ändern. '' 'TypeError: 'numpy.float64' Objekt unterstützt keine Objektzuweisung ' '' – RightmireM

+0

@RightmireM Wie genau versuchen Sie, sie zu ändern? Sie haben Recht, der Datentyp ist 'np.float64' – AlexG

5

Ähnlich @Shravan, aber ohne die Verwendung von numpy:

height = 10 
    width = 20 
    df_0 = pd.DataFrame(0, index=range(height), columns=range(width)) 

Dann können Sie tun, was man will:

post_instantiation_fcn = lambda x: str(x) 
df_ready_for_whatever = df_0.applymap(post_instantiation_fcn) 
Verwandte Themen