2013-06-18 12 views
16

Utilizzo la libreria Pandas per l'analisi delle serie temporali di telerilevamento. Alla fine mi piacerebbe salvare il mio DataFrame in csv usando le dimensioni del blocco, ma mi imbatto in un piccolo problema. Il mio codice genera 6 array NumPy che converto in serie Pandas. Ognuna di queste serie contiene un sacco di oggettiUtilizzo di Pandas per creare DataFrame con la serie, con conseguente errore di memoria

>>> prcpSeries.shape 
(12626172,) 

vorrei aggiungere la serie in una Pandas DataFram (df) così posso salvarli blocco per blocco in un file CSV.

d = {'prcp': pd.Series(prcpSeries), 
    'tmax': pd.Series(tmaxSeries), 
    'tmin': pd.Series(tminSeries), 
    'ndvi': pd.Series(ndviSeries), 
    'lstm': pd.Series(lstmSeries), 
    'evtm': pd.Series(evtmSeries)} 

df = pd.DataFrame(d) 
outFile ='F:/data/output/run1/_'+str(i)+'.out' 
df.to_csv(outFile, header = False, chunksize = 1000) 
d = None 
df = None 

Ma il mio codice rimane bloccata al seguente riga di dare un errore di memoria

df = pd.DataFrame(d) 

Qualche suggerimento? È possibile riempire il blocco DataFrame di Pandas per blocco?

+1

Si può fare un dataframe da una singola colonna: pd.DataFrane ({'tmax': pd.Series (tmaxSeries)})? –

+0

sì, che funziona – Mattijn

+1

crea un frame con la prima serie e aggiungili in sequenza, ad es. '' df = DataFrame ({'prcp': pd.Series (prcpSeries)}); df ['tmax'] = pd.Series (tmaxSeries) ''. Probabilmente dovresti scriverlo su un HDF5 in ogni caso, vedi: http://pandas.pydata.org/pandas-docs/dev/io.html#hdf5-pytables – Jeff

risposta

17

Se si conosce ciascuno di questi sono della stessa lunghezza allora si potrebbe creare il dataframe direttamente dalla matrice e quindi aggiungere ogni colonna:

df = pd.DataFrame(prcpSeries, columns=['prcp']) 
df['tmax'] = tmaxSeries 
... 

Nota: è anche possibile utilizzare il metodo to_frame (che vi permette di (opzionalmente) passare un nome - che è utile se la serie non ha uno):

df = prcpSeries.to_frame(name='prcp') 

Tuttavia, se sono di lunghezza variabile, questo perderà alcuni dati (eventuali array più lunghi di prcpSeries). Un'alternativa è quella di creare ogni come dataframe e quindi eseguire un outer join (utilizzando concat):

df1 = pd.DataFrame(prcpSeries, columns=['prcp']) 
df2 = pd.DataFrame(tmaxSeries, columns=['tmax']) 
... 

df = pd.concat([df1, df2, ...], join='outer', axis=1) 

Ad esempio:

In [21]: dfA = pd.DataFrame([1,2], columns=['A']) 

In [22]: dfB = pd.DataFrame([1], columns=['B']) 

In [23]: pd.concat([dfA, dfB], join='outer', axis=1) 
Out[23]: 
    A B 
0 1 1 
1 2 NaN 
+0

Grazie Andy e Jeff! Devo usare il primo metodo con l'aggiunta di ogni colonna, dal momento che il secondo approccio ottiene un errore di memoria sulla riga di df = pd.concat (ecc.). Conosco la serie con la lunghezza più lunga e useremo quella per inizializzare il DataFrame. – Mattijn

+0

Un avvertimento: sto usando la versione 0.14.1 di pandas e quando provo a forzare un oggetto Series a un oggetto DataFrame, se si specifica 'columns = ['my_column_name']' nella chiamata 'pandas.DataFrame()', l'oggetto risultante è un DataFrame vuoto. Quando ho abbandonato l'argomento colonne, il DataFrame risultante era come previsto. – Jubbles

+0

@Jubbles Grazie per aver menzionato questo, forse è più pulito usare il metodo 'to_frame' qui (non sono sicuro che fosse disponibile quando ho scritto la risposta originale) - Ho aggiornato questa risposta per menzionarlo. Darò un'occhiata per vedere se questo non funziona più in 0.14+, avrò un controllo in seguito per vedere. –

Problemi correlati