Python 熊猫:使用groupby

Python 熊猫:使用groupby,python,pandas,Python,Pandas,我有数据帧 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

我有数据帧

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})。重命名(列={'ID':'all_users','active_seconds':'all_time'}。重置_index()

我能接受

类别域所有用户所有时间
社交网络vk.com 2 92
社交网络facebook.com 1 18
电子邮件gmail.com 150

但是否有任何方法可以获得这种格式的报告:

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                   

您可以通过
sum
创建新的
DataFrame
,并添加新的级别,最后使用:

数据帧的另一个解决方案是通过和创建新列:


如果我的回答有帮助,别忘了。谢谢。你能说,我怎样才能将唯一用户的数量打印到分类,而不是总和?非常感谢!你能给我一些书或其他建议来提高技能吗?它返回一个错误
KeyError:
df2=df1.groupby('category').agg中的url\u maincegory'
({'all_users':'nunique','all_time':'sum'})
什么是
print(df1.columns.tolist())
?Keyerror显然意味着您希望选择一些不存在的列。但这里很有趣,因为只使用列
所有用户
所有时间
类别
。可能问题是
的url\u Maincategory
列丢失了,您以后在代码中需要它。您能检查一下吗?
#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
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