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')

Antworten auf die Frage(2)

Ihre Antwort auf die Frage