web-dev-qa-db-fra.com

Pandas groupby avec le nombre de bacs

J'ai un DataFrame qui ressemble à ceci:

+----------+---------+-------+
| 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 |
+----------+---------+-------+

et je voudrais le transformer pour compter les vues qui appartiennent à certains bacs comme celui-ci:

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

J'ai essayé:

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

Mais il ne donne que des comptes agrégés et non des comptes par utilisateur. Comment obtenir le nombre de bacs par utilisateur?

Le nombre total (en utilisant mes données réelles) ressemble à ceci:

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

Vous pouvez regrouper par les deux bacs et nom d'utilisateur, calculer la taille des groupes et ensuite utiliser 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
26
Alex Riley