Pandas Groupby Wertebereich

90

Gibt es in Pandas eine einfache Methode, um groupbyeine Reihe von Werteinkrementen aufzurufen ? Im folgenden Beispiel kann ich beispielsweise die Spalte Bmit einem 0.155Inkrement binieren und gruppieren, sodass beispielsweise die ersten paar Gruppen in der Spalte Bin Bereiche zwischen '0 - 0,155, 0,155 - 0,31 ...' unterteilt sind

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

Alternativ könnte ich zuerst die Daten nach diesen Inkrementen in eine neue Spalte kategorisieren und anschließend groupbyrelevante Statistiken ermitteln, die möglicherweise in der Spalte anwendbar sind A.

BJEBN
quelle

Antworten:

130

Sie könnten interessiert sein an 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
quelle
11
Kann ich das für mehrere Dimensionen tun? Im Wesentlichen nach zwei Werten gleichzeitig gruppieren?
Madsthaks
13

Versuche dies:

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

print df.groupby(ind).head()

Natürlich können Sie jede Funktion für die Gruppen verwenden, nicht nur head.

Alvaro Fuentes
quelle