Dividir un gran dataframe pandas

Tengo un gran dataframe con 423244 líneas. Quiero dividir esto en 4. Probé el siguiente código que dio un error? ValueError: array split does not result in an equal division

 for item in np.split(df, 4): print item 

¿Cómo dividir este dataframe en 4 grupos?

Utilice np.array_split :

 Docstring: Split an array into multiple sub-arrays. Please refer to the ``split`` documentation. The only difference between these functions is that ``array_split`` allows `indices_or_sections` to be an integer that does *not* equally divide the axis. 

 In [1]: import pandas as pd In [2]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : randn(8), 'D' : randn(8)}) In [3]: print df ABCD 0 foo one -0.174067 -0.608579 1 bar one -0.860386 -1.210518 2 foo two 0.614102 1.689837 3 bar three -0.284792 -1.071160 4 foo two 0.843610 0.803712 5 bar two -1.514722 0.870861 6 foo one 0.131529 -0.968151 7 foo three -1.002946 -0.257468 In [4]: import numpy as np In [5]: np.array_split(df, 3) Out[5]: [ ABCD 0 foo one -0.174067 -0.608579 1 bar one -0.860386 -1.210518 2 foo two 0.614102 1.689837, ABCD 3 bar three -0.284792 -1.071160 4 foo two 0.843610 0.803712 5 bar two -1.514722 0.870861, ABCD 6 foo one 0.131529 -0.968151 7 foo three -1.002946 -0.257468] 

Quería hacer lo mismo, y primero tuve problemas con la división de operaciones, luego problemas con la instalación de pandas 0.15.2, así que volví a mi versión anterior y escribí una pequeña función que funciona muy bien. ¡Espero que esto pueda ayudar!

 # input - df: a Dataframe, chunkSize: the chunk size # output - a list of DataFrame # purpose - splits the DataFrame into smaller of max size chunkSize (last is smaller) def splitDataFrameIntoSmaller(df, chunkSize = 10000): listOfDf = list() numberChunks = len(df) // chunkSize + 1 for i in range(numberChunks): listOfDf.append(df[i*chunkSize:(i+1)*chunkSize]) return listOfDf 

Precaución:

np.array_split no funciona con numpy-1.9.0. Eché un vistazo: funciona con 1.8.1.

Error:

Dataframe no tiene atributo de ‘tamaño’

Tenga en cuenta que np.array_split(df, 3) divide el dataframe en 3 sub-marcos de datos, mientras que splitDataFrameIntoSmaller(df, chunkSize = 3) divide el dataframe en cada fila de chunkSize .

Ejemplo:

 df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10,11], columns=['TEST']) df_split = np.array_split(df, 3) 

Obtienes 3 subttwigs de datos:

 df_split[0] # 1, 2, 3, 4 df_split[1] # 5, 6, 7, 8 df_split[2] # 9, 10, 11 

Con:

 df_split2 = splitDataFrameIntoSmaller(df, chunkSize = 3) 

Obtienes 4 sub-marcos de datos:

 df_split2[0] # 1, 2, 3 df_split2[1] # 4, 5, 6 df_split2[2] # 7, 8, 9 df_split2[3] # 10, 11 

Espero tener razón, espero que esto sea útil.

Supongo que ahora podemos usar iloc simple con range para esto.

 chunk_size = int(df.shape[0] / 4) for start in range(0, df.shape[0], chunk_size): df_subset = df.iloc[start:start + chunk_size] process_data(df_subset) .... 

Puede usar groupby , suponiendo que tiene un índice enumerado entero:

 import math df = pd.DataFrame(dict(sample=np.arange(99))) rows_per_subframe = math.ceil(len(df) / 4.) subframes = [i[1] for i in df.groupby(np.arange(len(df))//rows_per_subframe)] 

Nota: groupby devuelve una tupla en la que el segundo elemento es el dataframe, por lo que la extracción es ligeramente complicada.

 >>> len(subframes), [len(i) for i in subframes] (4, [25, 25, 25, 24])