Pandas – Slice Large Dataframe en Chunks

Tengo un gran dataframe (> filas de 3MM) que trato de pasar a través de una función (la que se muestra a continuación se simplifica en gran medida) y recibo un mensaje de Memory Error .

Creo que estoy pasando un dataframe demasiado grande a la función, así que estoy tratando de:

1) Corte el dataframe en partes más pequeñas (preferiblemente AcctName por AcctName )

2) Pase el dataframe a la función

3) Concatene los marcos de datos de nuevo en un gran dataframe

 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 

Sé que mi función funciona correctamente, ya que funcionará en un dataframe más pequeño (por ejemplo, 40,000 filas). Intenté lo siguiente, pero no tuve éxito en concatenar los pequeños marcos de datos en un gran dataframe.

 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) 

Cómo imagino que se dividan los marcos de datos:

 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 

Puede usar la comprensión de lista para dividir su dataframe en marcos de datos más pequeños contenidos en una lista.

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

Puede acceder a los trozos con:

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

Luego, puede volver a ensamblarlo en un único dataframe utilizando pd.concat.

Por nombre de cuenta

 list_df = [] for n,g in df.groupby('AcctName'): list_df.append(g)