2015-12-16 4 views
6

У меня есть DataFrame, который выглядит следующим образом:Панды GroupBy с бункером отсчитывает

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

и я хотел бы, чтобы преобразовать его в число просмотров, которые принадлежат к определенным бункерам, как это:

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

I попытался:

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

Но он дает только совокупный счет и не считается пользователем. Как я могу получить счет в корзине пользователем?

агрегированном подсчетов (с использованием моих реальных данных) выглядит следующим образом:

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

ответ

7

Вы могли группа обоего закромами и имени пользователя, вычислить размеры групп, а затем использовать 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 
Смежные вопросы