加权平均Pandas

2024-10-01 13:25:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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分组和取消堆叠,并计算体积加权平均高度,因此我尝试:

^{pr2}$

高度当然不是体积加权平均值。我怎样才能给它们称重?如图3和针叶树:

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


Tags: 数据importidpandas高度体积pdspecies
2条回答

如果我理解正确,一种方法是使用apply执行groupby

df
   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

df.groupby(['STAND_ID','Species']).apply(lambda x: (x['Height'] * x['Volume'].div(x['Volume'].sum())).sum()).unstack()

Species   Broadleaves    Conifer
STAND_ID                        
1                19.0  20.000000
2                 NaN  13.000000
3                24.0  24.363636

如果lambda函数令人困惑,^{也可以与函数定义一起使用。(还有一个函数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()

相关问题 更多 >