2017-05-31 8 views
1

Ich habe DatenrahmenPandas: mit 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 

Wenn ich

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

ich mit ihm bekommen

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

Aber ist eine Möglichkeit, Bericht zu erhalten in Dieses Format:

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     

Antwort

1

Sie können neue DataFrame erstellen, indem aggsum und nunique und fügen neue Ebene der MultiIndex.from_arrays, zuletzt concat mit sort_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 

Eine andere Lösung für neue DataFrame ist neue Spalte erstellen, indem assign und set_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

Wenn meine Antwort war hilfreich, nicht vergessen [akzeptieren] (http://meta.stackexchange.com/a/5235/295067) es. Vielen Dank. – jezrael

+0

Können Sie sagen, wie kann ich die Anzahl der eindeutigen Benutzer in Kategorie, nicht Summe drucken? –

+0

Ich bearbeite Antwort, bitte überprüfen Sie es. Vielen Dank. – jezrael