Groupe de pandas par plage de valeurs

92

Existe-t-il une méthode simple dans les pandas pour appeler groupbysur une plage d'incréments de valeurs? Par exemple, étant donné l'exemple ci-dessous, puis-je classer et regrouper la colonne Bavec un 0.155incrément de sorte que, par exemple, le premier couple de groupes de la colonne Bsoit divisé en plages comprises entre '0 - 0,155, 0,155 - 0,31 ...'

import numpy as np
import pandas as pd
df=pd.DataFrame({'A':np.random.random(20),'B':np.random.random(20)})

     A         B
0  0.383493  0.250785
1  0.572949  0.139555
2  0.652391  0.401983
3  0.214145  0.696935
4  0.848551  0.516692

Sinon, je pourrais d'abord classer les données par ces incréments dans une nouvelle colonne et ensuite les utiliser groupbypour déterminer les statistiques pertinentes qui peuvent être applicables dans la colonne A?

BJEBN
la source

Réponses:

132

Vous pourriez être intéressé par pd.cut:

>>> df.groupby(pd.cut(df["B"], np.arange(0, 1.0+0.155, 0.155))).sum()
                      A         B
B                                
(0, 0.155]     2.775458  0.246394
(0.155, 0.31]  1.123989  0.471618
(0.31, 0.465]  2.051814  1.882763
(0.465, 0.62]  2.277960  1.528492
(0.62, 0.775]  1.577419  2.810723
(0.775, 0.93]  0.535100  1.694955
(0.93, 1.085]       NaN       NaN

[7 rows x 2 columns]
DSM
la source
11
Est-il possible pour moi de faire cela pour plusieurs dimensions? Regrouper essentiellement par deux valeurs simultanément?
madsthaks
13

Essaye ça:

df = df.sort('B')
bins =  np.arange(0,1.0,0.155)
ind = np.digitize(df['B'],bins)

print df.groupby(ind).head()

Bien sûr, vous pouvez utiliser n'importe quelle fonction sur les groupes non seulement head.

Alvaro Fuentes
la source