Skip to main content
 首页 » 编程设计

python之Pandas :用百分比制作数据透视表

2025年05月04日16qq78292959

我有数据框

ID,url,used_at,active_seconds,domain 
61a77f9e5fd52a50c10cd2d4d886ec68,mazdaspb.ru,2015-01,6,mazdaspb.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,mazdaspb.ru/cars/mazda-cx-5/crossover/overview,2015-01,12,mazdaspb.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,mazdaspb.ru/cars/mazda-cx-5/crossover/overview,2015-01,19,mazdaspb.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,vw-stat.ru,2015-01,40,vw-stat.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,vw-stat.ru/models/new_tiguan,2015-01,12,vw-stat.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,vw-stat.ru/models/new_tiguan/comps,2015-01,48,vw-stat.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,vw-stat.ru/models/new_tiguan/comps/new_tiguan_track_field,2015-01,4,vw-stat.ru 
61a77f9e5fd52a50c10cd2d4d886ec68,vw-stat.ru/models/new_tiguan/comps/new_tiguan_track_field?engine_type=DIESEL&DIESEL=engines_4e53a3c8e986d,2015-01,78,vw-stat.ru 
41c2fd7a372729dfe336e44730169f28,avito.ru/saratov/avtomobili_s_probegom/volkswagen/golf?f=188_886b887,2015-01,8,avito.ru 
41c2fd7a372729dfe336e44730169f28,avito.ru/saratov/avtomobili_s_probegom/volkswagen/golf?f=188_886b887,2015-01,1,avito.ru 
41c2fd7a372729dfe336e44730169f28,avito.ru/saratov/avtomobili_s_probegom/volkswagen/golf?f=188_886b887,2015-01,2,avito.ru 

我需要制作数据透视表,并且应该有所有唯一 ID 的百分比值。 我可以得到

group = pd.pivot_table(df, index='used_at', columns='domain', values='ID', aggfunc=(lambda x: x.count())) 

但它会返回每个域每个月的唯一 ID 数量。如何将其转换为百分比?

请您参考如下方法:

IIUC 您可以使用参数 margins 作为 pivot_table 中的求和值然后将最后一行 All 的所有值除以 div :

group = pd.pivot_table(df,  
                       index='used_at',  
                       columns='domain',  
                       values='ID',  
                       aggfunc=len,  
                       margins=True) 
print (group) 
domain   avito.ru  mazdaspb.ru  vw-stat.ru   All 
used_at                                          
2015-01       3.0          3.0         5.0  11.0 
All           3.0          3.0         5.0  11.0 
 
print (group.iloc[:-1]) 
domain   avito.ru  mazdaspb.ru  vw-stat.ru   All 
used_at                                          
2015-01       3.0          3.0         5.0  11.0 
 
print (group.iloc[-1]) 
domain 
avito.ru        3.0 
mazdaspb.ru     3.0 
vw-stat.ru      5.0 
All            11.0 
Name: All, dtype: float64 
 
print (group.iloc[:-1].div(group.iloc[-1], axis=1) * 100) 
domain   avito.ru  mazdaspb.ru  vw-stat.ru    All 
used_at                                           
2015-01     100.0        100.0       100.0  100.0 

用 div 除以个体计数的解决方案和 mul :

group = pd.pivot_table(df,  
                       index='used_at', 
                       columns='domain',  
                       values='ID',  
                       aggfunc=len) 
          .div(len(df.index)) 
          .mul(100) 
print (group) 
 
domain    avito.ru  mazdaspb.ru  vw-stat.ru 
used_at                                     
2015-01  27.272727    27.272727   45.454545