web-dev-qa-db-fra.com

Utilisation de Pandas pour créer DataFrame avec Series, entraînant une erreur de mémoire

J'utilise Pandas bibliothèque pour l'analyse de séries chronologiques de télédétection. Finalement, je voudrais enregistrer mon DataFrame en csv en utilisant des tailles de bloc, mais je rencontre un petit problème. Mon code génère 6 Tableaux NumPy que je convertis en Pandas Series. Chacune de ces séries contient beaucoup d'éléments

>>> prcpSeries.shape
(12626172,)

Je voudrais ajouter la série dans un Pandas DataFrame (df) afin que je puisse les enregistrer morceau par morceau dans un fichier 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

Mais mon code reste bloqué à la ligne suivante, ce qui donne une erreur de mémoire

df = pd.DataFrame(d)

Aucune suggestion? Est-il possible de remplir le Pandas DataFrame morceau par morceau?

19
Mattijn

Si vous savez que chacun d'eux a la même longueur, vous pouvez créer le DataFrame directement à partir du tableau, puis ajouter chaque colonne:

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

Remarque: vous pouvez également utiliser le to_frame méthode (qui vous permet (éventuellement) de passer un nom - ce qui est utile si la série n'en a pas):

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

Cependant, s'ils sont de longueur variable, cela perdra certaines données (tous les tableaux qui sont plus longs que prcpSeries). Une alternative ici consiste à créer chacun en tant que DataFrame puis à effectuer une jointure externe (en utilisant concat ):

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

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

Par exemple:

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
20
Andy Hayden