196 votes

Fractionnement d'un grand dataframe pandas

J'ai un grand cadre de données avec 423244 lignes. Je veux le diviser en 4. J'ai essayé le code suivant qui a donné une erreur ? ValueError: array split does not result in an equal division

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

Comment diviser ce cadre de données en 4 groupes ?

347voto

root Points 14514

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
     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]

85voto

elixir Points 731

Je voulais faire la même chose, et j'ai eu d'abord des problèmes avec la fonction split, puis des problèmes avec l'installation de pandas 0.15.2, donc je suis revenu à mon ancienne version, et j'ai écrit une petite fonction qui fonctionne très bien. J'espère que cela pourra vous aider !

# 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

50voto

Gilberto Points 173

Sachez que np.array_split(df, 3) divise le dataframe en 3 sous-dataframes, tandis que l'option split_dataframe définie dans La réponse de @elixir lorsqu'il est appelé split_dataframe(df, chunk_size=3) divise la trame de données tous les chunk_size rangs.

Exemple :

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

...vous obtenez 3 sous-dataframes :

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

Avec split_dataframe :

df_split2 = split_dataframe(df, chunk_size=3)

...vous obtenez 4 sous-dataframes :

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

J'espère que j'ai raison et que cela vous sera utile.

34voto

pratpor Points 523

Je suppose que maintenant nous pouvons utiliser le simple iloc con range pour ça.

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

11voto

Rishabh Vij Points 140

Vous pouvez utiliser les compréhensions de listes pour faire cela en une seule ligne

n = 4
chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X