透视的一个想法:
df1 = df.pivot_table(index=['date','region'],columns='traffic_type',values='total_views',aggfunc='sum')print (df1)traffic_type desktop mobileweb totaldate region 01/04/2018 aug 50 60 200world 20 30 40df2 = df1['desktop'].div(df1['total']).reset_index(name='desktop_share').assign(traffic_type='total')df = df.merge(df2, how='left')print (df) traffic_type date region total_views desktop_share0 desktop 01/04/2018 aug50 NaN1 mobileweb 01/04/2018 aug60 NaN2 total 01/04/2018 aug 2000.253 desktop 01/04/2018 world20 NaN4 mobileweb 01/04/2018 world30 NaN5 total 01/04/2018 world400.50
另一个想法是
MultiIndex:
df1 = df.set_index(['traffic_type','date','region'])a = df1.xs('desktop', drop_level=False).rename({'desktop':'total'})b = df1.xs('total', drop_level=False)df = df1.assign(desktop_share = a['total_views'].div(b['total_views'])).reset_index()print (df) traffic_type date region total_views desktop_share0 desktop 01/04/2018 aug50 NaN1 mobileweb 01/04/2018 aug60 NaN2 total 01/04/2018 aug 2000.253 desktop 01/04/2018 world20 NaN4 mobileweb 01/04/2018 world30 NaN5 total 01/04/2018 world400.50


