So erstellen Sie eine Pivot-Tabelle für extrem große Datenrahmen in Pandas
Ich muss eine Pivot-Tabelle mit 2000 Spalten und ungefähr 30-50 Millionen Zeilen aus einem Datensatz mit ungefähr 60 Millionen Zeilen erstellen. Ich habe versucht, in Blöcken von 100.000 Zeilen zu pendeln, und das funktioniert, aber wenn ich versuche, die DataFrames durch Ausführen von .append () gefolgt von .groupby ('someKey'). Sum () neu zu kombinieren, wird mein gesamter Speicher belegt und Python stürzt schließlich ab.
Wie kann ich einen Pivot-Vorgang für so große Datenmengen mit einem begrenzten RAM-Speicher durchführen?
EDIT: Beispielcode hinzufügen
Der folgende Code enthält verschiedene Testausgaben auf dem Weg, aber der letzte Ausdruck ist das, woran wir wirklich interessiert sind. Beachten Sie, dass der Code bei Änderung von segMax auf 3 anstelle von 4 ein falsches Positiv für die korrekte Ausgabe erzeugt. Das Hauptproblem besteht darin, dass, wenn sich nicht in jedem Teil, den diese Summe (wawa) betrachtet, ein Eintrag mit der Sendungs-ID befindet, dieser nicht in der Ausgabe angezeigt wird.
import pandas as pd
import numpy as np
import random
from pandas.io.pytables import *
import os
pd.set_option('io.hdf.default_format','table')
# create a small dataframe to simulate the real data.
def loadFrame():
frame = pd.DataFrame()
frame['shipmentid']=[1,2,3,1,2,3,1,2,3] #evenly distributing shipmentid values for testing purposes
frame['qty']= np.random.randint(1,5,9) #random quantity is ok for this test
frame['catid'] = np.random.randint(1,5,9) #random category is ok for this test
return frame
def pivotSegment(segmentNumber,passedFrame):
segmentSize = 3 #take 3 rows at a time
frame = passedFrame[(segmentNumber*segmentSize):(segmentNumber*segmentSize + segmentSize)] #slice the input DF
# ensure that all chunks are identically formatted after the pivot by appending a dummy DF with all possible category values
span = pd.DataFrame()
span['catid'] = range(1,5+1)
span['shipmentid']=1
span['qty']=0
frame = frame.append(span)
return frame.pivot_table(['qty'],index=['shipmentid'],columns='catid', \
aggfunc='sum',fill_value=0).reset_index()
def createStore():
store = pd.HDFStore('testdata.h5')
return store
segMin = 0
segMax = 4
store = createStore()
frame = loadFrame()
print('Printing Frame')
print(frame)
print(frame.info())
for i in range(segMin,segMax):
segment = pivotSegment(i,frame)
store.append('data',frame[(i*3):(i*3 + 3)])
store.append('pivotedData',segment)
print('\nPrinting Store')
print(store)
print('\nPrinting Store: data')
print(store['data'])
print('\nPrinting Store: pivotedData')
print(store['pivotedData'])
print('**************')
print(store['pivotedData'].set_index('shipmentid').groupby('shipmentid',level=0).sum())
print('**************')
print('$)
for df in store.select('pivotedData',chunksize=3):
print(df.set_index('shipmentid').groupby('shipmentid',level=0).sum())
print('$)
store['pivotedAndSummed'] = sum((df.set_index('shipmentid').groupby('shipmentid',level=0).sum() for df in store.select('pivotedData',chunksize=3)))
print('\nPrinting Store: pivotedAndSummed')
print(store['pivotedAndSummed'])
store.close()
os.remove('testdata.h5')
print('closed')