Pandas groupby con cuentas bin

Tengo un DataFrame que se ve así:

+----------+---------+-------+ | username | post_id | views | +----------+---------+-------+ | john | 1 | 3 | | john | 2 | 23 | | john | 3 | 44 | | john | 4 | 82 | | jane | 7 | 5 | | jane | 8 | 25 | | jane | 9 | 46 | | jane | 10 | 56 | +----------+---------+-------+ 

y me gustaría transformarlo para contar vistas que pertenecen a ciertos contenedores como este:

 +------+------+-------+-------+--------+ | | 1-10 | 11-25 | 25-50 | 51-100 | +------+------+-------+-------+--------+ | john | 1 | 1 | 1 | 1 | | jane | 1 | 1 | 1 | 1 | +------+------+-------+-------+--------+ 

Lo intenté:

 bins = [1, 10, 25, 50, 100] groups = df.groupby(pd.cut(df.views, bins)) groups.username.count() 

Pero solo da recuentos agregados y no cuenta por usuario. ¿Cómo puedo obtener conteos de bin por usuario?

Los recuentos agregados (usando mis datos reales) se ven así:

 impressions (2500, 5000] 2332 (5000, 10000] 1118 (10000, 50000] 570 (50000, 10000000] 14 Name: username, dtype: int64 

Podrías agrupar por las bandejas y el nombre de usuario, calcular los tamaños de los grupos y luego usar unstack() :

 >>> groups = df.groupby(['username', pd.cut(df.views, bins)]) >>> groups.size().unstack() views (1, 10] (10, 25] (25, 50] (50, 100] username jane 1 1 1 1 john 1 1 1 1