Dividir un marco de datos de pandas grande

Resuelto Nilani Algiriyage asked hace 11 años • 10 respuestas

Tengo un marco de datos grande con 423244 líneas. Quiero dividir esto en 4. Probé el siguiente código y 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 marco de datos en 4 grupos?

Nilani Algiriyage avatar Jun 26 '13 16:06 Nilani Algiriyage
Aceptado

Usar 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
     A      B         C         D
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]: 
[     A    B         C         D
0  foo  one -0.174067 -0.608579
1  bar  one -0.860386 -1.210518
2  foo  two  0.614102  1.689837,
      A      B         C         D
3  bar  three -0.284792 -1.071160
4  foo    two  0.843610  0.803712
5  bar    two -1.514722  0.870861,
      A      B         C         D
6  foo    one  0.131529 -0.968151
7  foo  three -1.002946 -0.257468]
root avatar Jun 26 '2013 09:06 root

Quería hacer lo mismo y primero tuve problemas con la función de división, 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 chunks
def split_dataframe(df, chunk_size = 10000): 
    chunks = list()
    num_chunks = len(df) // chunk_size + 1
    for i in range(num_chunks):
        chunks.append(df[i*chunk_size:(i+1)*chunk_size])
    return chunks
elixir avatar Mar 05 '2015 15:03 elixir

Tenga en cuenta que np.array_split(df, 3)divide el marco de datos en 3 submarcos de datos, mientras que la split_dataframefunción definida en la respuesta de @elixir , cuando se llama como split_dataframe(df, chunk_size=3), divide el marco de datos en cada chunk_sizefila.

Ejemplo:

Con np.array_split:

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 submarcos de datos:

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

Con split_dataframe:

df_split2 = split_dataframe(df, chunk_size=3)

...obtienes 4 submarcos 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 y que esto sea útil.

Gilberto avatar Jul 12 '2017 10:07 Gilberto