Skip to main content
 首页 » 编程设计

python之加权平均 Pandas

2025年05月04日11mfryf

我有一个包含林分编号、树种、高度和体积的数据框:

import pandas as pd 
 
df=pd.DataFrame.from_items([('STAND_ID',[1,1,2,3,3,3]),('Species',['Conifer','Broadleaves','Conifer','Broadleaves','Conifer','Conifer']), 
                             ('Height',[20,19,13,24,25,18]),('Volume',[200,100,300,50,100,10])]) 
 
   STAND_ID      Species  Height  Volume 
0         1      Conifer      20     200 
1         1  Broadleaves      19     100 
2         2      Conifer      13     300 
3         3  Broadleaves      24      50 
4         3      Conifer      25     100 
5         3      Conifer      18      10 

我想按展台 ID 进行分组和拆分并计算体积加权平均高度,所以我尝试:

newdf=df.groupby(['STAND_ID','Species']).mean().unstack() 
 
          Height              Volume         
Species  Broadleaves Conifer Broadleaves Conifer 
STAND_ID                                         
1               19.0    20.0       100.0   200.0 
2                NaN    13.0         NaN   300.0 
3               24.0    21.5        50.0    55.0 

高度当然不是体积加权平均值。我怎样才能对它们进行体积加权?对于 STAND_ID 3 和 Conifer,就像这样:

(25*100 + 18*10)/(100+10)=24.4

请您参考如下方法:

如果 lambda 函数令人困惑,apply 也可以与函数定义一起使用。 (而且还有一个函数numpy.average来计算加权平均值)

import numpy as np 
def weighted_average(group): 
   weights = group['Volume'] 
   height = group['Height']    
   return np.average(height,weights=weights) 
 
df.groupby(['STAND_ID','Species']).apply(func = weighted_average).unstack()