2015-06-26 5 views
1

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

+---+-----------+----------------+-------+ 
| | uid |  msg  | count | 
+---+-----------+----------------+-------+ 
| 0 | 121437681 | eis   |  1 | 
| 1 | 14403832 | eis   |  1 | 
| 2 | 190442364 | eis   |  1 | 
| 3 | 190102625 | eis   |  1 | 
| 4 | 190428772 | eis_reply  |  1 | 
| 5 | 190428772 | single_message |  1 | 
| 6 | 190428772 | yes   |  1 | 
| 7 | 190104837 | eis   |  1 | 
| 8 | 144969454 | eis   |  1 | 
| 9 | 190738403 | eis   |  1 | 
+---+-----------+----------------+-------+ 

То, что я хотел бы сделать, это подсчет экземпляров каждого msg для каждой жидкости.

Я создал GroupBy объект и нашел количество всех сообщений:

grouped_test = test.groupby('uid') 
grouped_test.count('msg') 

Но я не совсем уверен, как считать каждый тип сообщения для каждого из жидкости. Я думал о создании масок и 4 отдельных кадрах данных, но это не похоже на эффективный способ сделать это.

Пример данных - http://www.sharecsv.com/s/16573757eb123c5b15cae4edcb7296e3/sample_data.csv

+0

Пожалуйста, разместите свои данные образца в формате, который легко вырезать-и-pastable в pandas (в идеале формат CSV). – BrenBarn

+0

Насколько велики ваши данные? – Leb

+0

@ Leb около 10 000 строк, Есть 237 сгруппированных uids, хотя – metersk

ответ

7

Группа по UID и применить value_counts к колонке MSG:

>>> d.groupby('uid').msg.value_counts() 
uid      
14403832 eis    1 
121437681 eis    1 
144969454 eis    1 
190102625 eis    1 
190104837 eis    1 
190170637 eis    1 
190428772 eis    1 
      single_message 1 
      yes    1 
      eis_reply   1 
190442364 eis    1 
190738403 eis    1 
190991478 single_message 1 
      eis_reply   1 
      yes    1 
191356453 eis    1 
191619393 eis    1 
dtype: int64 
2

Применить groupby на обоих id и msg, а затем просуммировать count каждого:

>>> df.groupby(['uid', 'msg'])['count'].sum() 
uid  msg   
14403832 eis    1 
121437681 eis    1 
144969454 eis    1 
190102625 eis    1 
190104837 eis    1 
190170637 eis    1 
190428772 eis    1 
      eis_reply   1 
      single_message 1 
      yes    1 
190442364 eis    1 
190738403 eis    1 
190991478 eis_reply   1 
      single_message 1 
      yes    1 
191356453 eis    1 
191619393 eis    1 
Name: count, dtype: int64 

Вы можете сбросить индекс, чтобы получить сплющенную версию:

>>> df.groupby(['uid', 'msg'])['count'].sum().reset_index() 
      uid    msg count 
0 14403832    eis  1 
1 121437681    eis  1 
2 144969454    eis  1 
3 190102625    eis  1 
4 190104837    eis  1 
5 190170637    eis  1 
6 190428772    eis  1 
7 190428772  eis_reply  1 
8 190428772 single_message  1 
9 190428772    yes  1 
10 190442364    eis  1 
11 190738403    eis  1 
12 190991478  eis_reply  1 
13 190991478 single_message  1 
14 190991478    yes  1 
15 191356453    eis  1 
16 191619393    eis  1 
Смежные вопросы