2 votes

Pandas : comment grouper les groupes en fonction d'un modèle de série ?

Ayant le df suivant :

pd.DataFrame({'bool':[True,True,True, False,True,True,True],
              'foo':[1,3,2,6,2,4,7]})

ce qui donne :

    bool    foo
0   True    1
1   True    3
2   True    2
3   False   6
4   True    2
5   True    4
6   True    7

comment groupby Trues en 2 groupes, pour avoir des indices [0:2] sur group 1 et [4:6] sur group 2 ?

La sortie souhaitée : group1 :

    bool    foo
0   True    1
1   True    3
2   True    2

groupe2 :

4   True    2
5   True    4
6   True    7

Merci !

3voto

Ayoub ZAROU Points 2220

Vous pourriez faire :

import numpy as np
x = df[df["bool"]].index.values
groups = np.split(x, np.where(np.diff(x)>1)[0]+1)
df_groups = [df.iloc[gr, :] for gr in groups]

La sortie ressemble à :

df_groups[0]
Out[56]: 
   bool  foo
0  True    1
1  True    3
2  True    2

df_groups[1]
Out[57]: 
   bool  foo
4  True    2
5  True    4
6  True    7

1voto

CHAMI Soufiane Points 610

Voici un moyen simple de le faire :

# Split the dataframe by `Series` using `cumsum`
g =(~data['bool']).cumsum().where(data['bool'])

dfs= {'group_'+str(i+1):v for i, (k, v) in enumerate(data[['foo']].groupby(g))}

vous pouvez accéder à chaque cadre de données en utilisant les clés 'group_'+str(i+1) comme group_1 , group_2 etc :

print(dfs['group_1'])

   foo
0    1
1    3
2    2

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