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 ?

8voto

yemu Points 1054

Attention :

np.array_split ne fonctionne pas avec numpy-1.9.0. J'ai vérifié : Il fonctionne avec 1.8.1.

Erreur :

Le cadre de données n'a pas d'attribut "size".

7voto

raphael Points 726

En s'appuyant sur la réponse de @elixir...
Je suggère d'utiliser un générateur pour éviter de charger tous les chunks en mémoire :

def chunkit(df, chunk_size = 10000): 
    num_chunks = len(df) // chunk_size
    if len(df) % chunk_size != 0:
        num_chunks += 1
    for i in range(num_chunks):
        yield df[i*chunk_size:(i + 1) * chunk_size]

7voto

drkr Points 81

J'aime les blagues à une ligne, donc la réponse de @LucyDrops me convient.

Cependant, il y a une chose importante : ajouter un .copy() si les morceaux doivent être des COPIES de l'original df pièces :

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

Sinon, il y a de fortes chances de recevoir l'alerte suivante au cours du traitement ultérieur de l'alerte. chunks (en boucle par exemple) :

A value is trying to be set on a copy of a slice from a DataFrame.

(voir les détails dans le Documentation sur les pandas )

5voto

rumpel Points 2506

Vous pouvez utiliser groupby en supposant que vous avez un indice énuméré entier :

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

Note : groupby renvoie un tuple dans lequel le deuxième élément est le dataframe, d'où l'extraction légèrement compliquée.

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

1voto

J'ai également connu np.array_split ne fonctionne pas avec Pandas DataFrame. Ma solution a été de ne diviser que l'index du DataFrame et d'introduire ensuite une nouvelle colonne avec l'étiquette "groupe" :

indexes = np.array_split(df.index,N, axis=0)
for i,index in enumerate(indexes):
   df.loc[index,'group'] = i

Cela rend les opérations groupby très pratiques, par exemple pour calculer la valeur moyenne de chaque groupe :

df.groupby(by='group').mean()

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