2017-05-31 154 views
1

我有数据帧熊猫:使用GROUPBY

ID domain category active_seconds 
111 vk.com Social_network 42 
111 facebook.com Social_network 18 
222 vk.com  Social_network  50 
222 gmail.com E-mail 50 

如果我使用

df.groupby(['category', 'domain']).agg({'ID': pd.Series.nunique, 'active_seconds': np.sum}).rename(columns={'ID': 'all_users', 'active_seconds': 'all_time'}.reset_index()

我得到它

category domain all_users all_time Social_network vk.com 2 92 Social_network facebook.com 1 18 E-mail gmail.com 1 50

但就是没有办法让报告这种格式:

category   domain  all_users  all_time 
Social_network     2   110 
        vk.com  2    92 
        facebook.com 1    18 

E-mail       1    50 
        gmail.com  1    50     

回答

1

您可以通过aggsumnunique创造新DataFrame并加入MultiIndex.from_arrays新的水平,最后concatsort_index

#omit reset_index 
df1 = df.groupby(['category', 'domain']) 
     .agg({'ID': pd.Series.nunique, 'active_seconds': np.sum}) 
     .rename(columns={'ID': 'all_users', 'active_seconds': 'all_time'}) 

df2 = df1.groupby('category').agg({'all_users': 'nunique', 'all_time': 'sum'}) 

df2.index = pd.MultiIndex.from_arrays([df2.index, [''] * len(df2.index)], 
             names=('category','domain')) 
print (df2) 
         all_time all_users 
category  domain      
E-mail      50   1 
Social_network    110   2 

print (pd.concat([df1,df2]).sort_index()) 
          all_time all_users 
category  domain       
E-mail        50   1 
       gmail.com   50   1 
Social_network     110   2 
       facebook.com  18   1 
       vk.com    92   2 

DataFrame另一个解决方案是通过assignset_index创建新列:

df2 = df1.groupby('category').agg({'all_users': 'nunique', 'all_time': 'sum'}) 
     .assign(domain='') 
     .set_index('domain', append=True) 
print (df2) 
         all_time all_users 
category  domain      
E-mail      50   1 
Social_network    110   2 
+0

如果我的回答很有帮助,不要忘记[接受](http://meta.stackexchange.com/a/5235/295067)它。谢谢。 – jezrael

+0

你可以说,我怎样才能打印唯一用户数量的类别,而不是总和? –

+0

我编辑答案,请检查它。谢谢。 – jezrael