Creazione di un data frame panda a riempimento zero


103

Qual è il modo migliore per creare un data frame di panda a riempimento zero di una determinata dimensione?

Ho usato:

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

C'è un modo migliore per farlo?


1
No, non riesco a pensare a nessun miglioramento sostanziale su questo.
Dan Allan

Ricevo un errore di memoria su np.zeros, poiché i dati sono un grande insieme. Qualche suggerimento su cosa posso fare? Non ho altri output oltre a "MemoryError". Ho 100 GB di RAM e i dati sono solo 20 GB, ma non riesco ancora. Non ho idea di come eseguire il debug, server Ubuntu a 64 bit. Ho cercato su Google per un po ', ma tutti dicono: dividi in blocchi, ma questi dati non possono essere divisi.
niedakh

Puoi semplicemente lavorare con data? Perché hai bisogno di creare un'altra struttura per sostenerlo?
Phillip Cloud

Risposte:


138

Puoi provare questo:

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

2
Per provare questo, trovo che %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])ci voglia 156. Ma ci %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])vogliono 171. Sono sorpreso che non sia più veloce.
emschorsch

3
Nota che potresti incorrere in problemi di int / float se farai qualcosa di simile d.set_value(params)dopo l'inizializzazione dper contenere 0. Una soluzione semplice è: d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list).
ximiki

29

È meglio farlo con numpy secondo me

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

1
Quando l'ho fatto in questo modo, non ho potuto modificare i valori "0". TypeError: 'numpy.float64' object does not support item assignment
RightmireM

@RightmireM In che modo esattamente stai cercando di modificarli? Hai ragione, il tipo di dati ènp.float64
AlexG

11

Simile a @Shravan, ma senza l'uso di numpy:

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

Quindi puoi fare quello che vuoi con esso:

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

8

Se desideri che il nuovo data frame abbia lo stesso indice e le stesse colonne di un data frame esistente, puoi semplicemente moltiplicare il data frame esistente per zero:

df_zeros = df * 0

2
Tieni presente che otterrai NaN invece di zeri ogniqualvolta df contiene NaN.
kadee

1

Se hai già un dataframe, questo è il modo più veloce:

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

Confrontare con:

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

Supponendo di avere un modello DataFrame, che si vorrebbe copiare con zero valori riempiti qui ...

Se non hai NaN nel tuo set di dati, la moltiplicazione per zero può essere notevolmente più veloce:

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

Il miglioramento dipende dalle dimensioni di DataFrame, ma non è mai stato trovato più lento.

E solo per il gusto di farlo:

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

Ma:

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

MODIFICARE!!!

Supponendo che tu abbia un frame che usa float64, questo sarà il più veloce con un enorme margine! È anche in grado di generare qualsiasi valore sostituendo 0,0 al numero di riempimento desiderato.

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

A seconda del gusto, si può definire esternamente nan e fare una soluzione generale, indipendentemente dal particolare tipo di galleggiante:

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
Questa è sicuramente la risposta più esauriente sui tempi, anche se per l'OP sembra che i requisiti di memoria fossero il problema e non la velocità ... A proposito, sul mio sistema i primi due suggerimenti che hai scritto danno la stessa tempistica (Panda 0.20.3 ), quindi forse ci sono stati dei cambiamenti.
Moot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.