Pandas Groupby Faixa de Valores

94

Existe um método fácil em pandas para invocar groupbyem uma faixa de incrementos de valores? Por exemplo, dado o exemplo abaixo, posso categorizar e agrupar a coluna Bcom um 0.155incremento de modo que, por exemplo, o primeiro par de grupos na coluna Bseja dividido em intervalos 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

Como alternativa, eu poderia primeiro categorizar os dados por esses incrementos em uma nova coluna e, posteriormente, usar groupbypara determinar quaisquer estatísticas relevantes que possam ser aplicáveis ​​na coluna A.

BJEBN
fonte

Respostas:

137

Você pode estar interessado em 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
fonte
12
É possível fazer isso em várias dimensões? Essencialmente agrupando por dois valores simultaneamente?
madsthaks
Eu tive que agrupar usando 2 colunas. A primeira coluna era uma string e tive que agrupar linhas com os mesmos nomes. Entre esses grupos, tive que agrupá-los ainda mais com base na faixa de valores da segunda coluna. Fiz da seguinte maneira:(qa_scores_data.groupby(['Video Name', pandas.cut(qa_scores_data['Frame Name'].astype('float'), [0.5, 12.5, 24.5, 36.5, 48.5])])).mean()
Nagabhushan SN
13

Experimente isto:

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

print df.groupby(ind).head()

Claro que você pode usar qualquer função nos grupos, não apenas head.

Alvaro Fuentes
fonte