2015-12-16 3 views
6

ich einen Datenrahmen haben, die wie folgt aussieht:Pandas groupby mit bin zählt

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

und ich möchte es verwandeln Ansichten zu zählen, die wie folgt auf bestimmte Fächer gehören:

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

I versucht:

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

Aber es gibt nur Aggregat zählt und nicht von Benutzern gezählt. Wie kann ich die Anzahl der Behälter nach Benutzer berechnen?

Die Gesamtzahlen (meine realen Daten verwendet wird) sieht wie folgt aus:

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

Antwort

7

Sie konnten beide Gruppen von den Fächern und Benutzernamen, die Gruppengrößen berechnen und dann verwenden 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