2016-06-17 4 views
3

У меня есть данныеGroupBy пеленгации столбцов с помощью панд

1  member_id application_name active_seconds 
2   192180    Opera 6 
3   192180    Opera 7 
4   192180    Chrome 243 
5   5433112   Chrome 52 
6   5433112   Opera 34 
7   5433112   Chrome 465 

мне нужно сгруппировать его по количеству использования application_name и количество active_seconds

Я использую print df.groupby(['member_id', 'application_name']).count() но получить результат к active_second и

print df.groupby(['member_id', 'application_name'])['active_seconds'].count() 

работает некорректно. Что я делаю неправильно?

ответ

4

Я думаю, что вам нужно aggregate:

df1 = df.groupby(['member_id', 'application_name']) 
     .agg({'application_name':len, 'active_seconds':sum}) 

print (df1) 
          active_seconds application_name 
member_id application_name         
192180 Chrome      243     1 
      Opera       13     2 
5433112 Chrome      517     2 
      Opera       34     1 

Если потребность reset_index, первые rename колонны (потому ValueError: cannot insert application_name, already exists):

df1 = df.groupby(['member_id', 'application_name']) 
     .agg({'application_name':len, 'active_seconds':sum}) 
     .rename(columns={'active_seconds':'count_sec','application_name':'sum_app'}) 
     .reset_index() 

print (df1) 
    member_id application_name count_sec sum_app 
0  192180   Chrome  243  1 
1  192180   Opera   13  2 
2 5433112   Chrome  517  2 
3 5433112   Opera   34  1 

Timings:

In [208]: %timeit df.groupby(['member_id', 'application_name']).agg({'application_name':len, 'active_seconds':sum}).rename(columns={'active_seconds':'count_sec','application_name':'sum_app'}).reset_index() 
10 loops, best of 3: 93.6 ms per loop 

In [209]: %timeit (f1(df)) 
10 loops, best of 3: 127 ms per loop 

Код для тестирования:

import pandas as pd 

df = pd.DataFrame({'member_id': {0: 192180, 1: 192180, 2: 192180, 3: 5433112, 4: 5433112, 5: 5433112}, 
        'active_seconds': {0: 6, 1: 7, 2: 243, 3: 52, 4: 34, 5: 465}, 
        'application_name': {0: 'Opera', 1: 'Opera', 2: 'Chrome', 3: 'Chrome', 4: 'Opera', 5: 'Chrome'}}) 
print (df) 
# active_seconds application_name member_id 
#0    6   Opera  192180 
#1    7   Opera  192180 
#2    243   Chrome  192180 
#3    52   Chrome 5433112 
#4    34   Opera 5433112 
#5    465   Chrome 5433112 

df = pd.concat([df]*1000).reset_index(drop=True) 
print (len(df)) 
#6000 

df1 = df.groupby(['member_id', 'application_name']).agg({'application_name':len, 'active_seconds':sum}).rename(columns={'active_seconds':'count_sec','application_name':'sum_app'}).reset_index() 
print (df1) 

def f1(df): 
    a = (df.groupby(['member_id', 'application_name'])['active_seconds'].sum()) 
    b = (df.groupby(['member_id', 'application_name']).size()) 
    return (pd.concat([a,b], axis=1, keys=['count_sec','sum_app']).reset_index()) 

print (f1(df)) 
# member_id application_name count_sec sum_app 
#0  192180   Chrome  243000  1000 
#1  192180   Opera  13000  2000 
#2 5433112   Chrome  517000  2000 
#3 5433112   Opera  34000  1000 
# member_id application_name count_sec sum_app 
#0  192180   Chrome  243000  1000 
#1  192180   Opera  13000  2000 
#2 5433112   Chrome  517000  2000 
#3 5433112   Opera  34000  1000 
+0

спасибо, я понимаю свою ошибку – ldevyataykina

+0

Но как я могу добавить столбец Eiter к одному ФР? Я хочу показать id, application_name, countof посещения и следующее количество активных_секунд? – ldevyataykina

+0

Если у меня 10 миллионов строк, как долго это работает? он не печатает результат через 5 минут – ldevyataykina

Смежные вопросы