簡體   English   中英

使用pandas的Groupby df列

[英]Groupby df column using pandas

我有數據

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() 

工作不正確。 我做錯了什么?

我認為你需要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

時間

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM