2017-06-23 3 views
1

Ich habe einen großen Datenrahmen (> 3MM Reihen), die ich versuche, eine Funktion zu durchlaufen (die unten ist weitgehend vereinfacht), und ich bekomme eine Memory Error Nachricht.Pandas - Slice Large Dataframe in Chunks

Ich glaube, ich bin vorbei zu groß von einem Datenrahmen in die Funktion, so versuche ich zu:

1) Scheibe des Datenrahmen in kleinere Stücke (vorzugsweise durch AcctName in Scheiben geschnitten)

2) Übergeben des Datenrahmen in die Funktion

3) Verketten den Datenrahmen zurück in einen großen Datenrahmen

def trans_times_2(df): 
    df['Double_Transaction'] = df['Transaction'] * 2 

large_df 
AcctName Timestamp Transaction 
ABC  12/1   12.12 
ABC  12/2   20.89 
ABC  12/3   51.93  
DEF  12/2   13.12 
DEF  12/8   9.93 
DEF  12/9   92.09 
GHI  12/1   14.33 
GHI  12/6   21.99 
GHI  12/12  98.81 

Ich weiß, dass meine Funktion ordnungsgemäß funktioniert, da sie auf einem kleineren Datenrahmen (z. 40.000 Zeilen). Ich habe folgendes versucht, aber es ist mir nicht gelungen, die kleinen Datenrahmen wieder in einen großen Datenrahmen zu verketten.

def split_df(df): 
    new_df = [] 
    AcctNames = df.AcctName.unique() 
    DataFrameDict = {elem: pd.DataFrame for elem in AcctNames} 
    key_list = [k for k in DataFrameDict.keys()] 
    new_df = [] 
    for key in DataFrameDict.keys(): 
     DataFrameDict[key] = df[:][df.AcctNames == key] 
     trans_times_2(DataFrameDict[key]) 
    rejoined_df = pd.concat(new_df) 

Wie stelle ich mich die, die geteilten Datenrahmen:

df1 
AcctName Timestamp Transaction Double_Transaction 
ABC  12/1   12.12  24.24 
ABC  12/2   20.89  41.78 
ABC  12/3   51.93  103.86 

df2 
AcctName Timestamp Transaction Double_Transaction 
DEF  12/2   13.12  26.24 
DEF  12/8   9.93  19.86 
DEF  12/9   92.09  184.18 

df3 
AcctName Timestamp Transaction Double_Transaction 
GHI  12/1   14.33  28.66 
GHI  12/6   21.99  43.98 
GHI  12/12  98.81  197.62 

Antwort

6

Sie Liste Verständnis verwenden kann, um Datenrahmen in kleineren Datenrahmen in einer Liste enthalten ist, zu teilen.

n = 200000 #chunk row size 
list_df = [df[i:i+n] for i in range(0,df.shape[0],n)] 

Sie können die Stücke Zugriff mit:

list_df[0] 
list_df[1] 
etc... 

Dann sind Sie es wieder in eine ein Datenrahmen mit pd.concat zusammenstellen können.

von AcctName

list_df = [] 

for n,g in df.groupby('AcctName'): 
    list_df.append(g) 
+0

Dank Scott! Gibt es eine Möglichkeit, sich in kleinere Datenrahmen zu teilen, basierend auf "AcctName" anstatt der Chunk-Größe? –

+0

@WaltReed Probieren Sie diesen zweiten Teil mit groupby aus. –

+0

Okay, großartig, das hat funktioniert! Ich rufe dies in einer Funktion auf, aber wenn ich versuche, den neuen Datenrahmen * nach dem Ausführen der Funktion zu sehen, bekomme ich den Fehler 'NameError: Name 'new_df' ist nicht definiert '. Was fehlt mir hier? –