【问题标题】:Groupby and weighted average分组和加权平均
【发布时间】:2017-11-08 16:12:46
【问题描述】:

我有一个数据框:

import pandas as pd
import numpy as np

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]),('Stems',[1500,2000,1000,1200,1700,1000]),('Volume',[200,100,300,50,100,10])])

   STAND_ID      Species  Height  Stems  Volume
0         1      Conifer      20   1500     200
1         1  Broadleaves      19   2000     100
2         2      Conifer      13   1000     300
3         3  Broadleaves      24   1200      50
4         3      Conifer      25   1700     100
5         3      Conifer      18   1000      10

我想按 STAND_ID 和 Species 分组,对 Height 和 Stems 应用加权平均值,Volume 作为权重并取消堆叠。

所以我试试:

newdf=df.groupby(['STAND_ID','Species']).agg({'Height':lambda x: np.average(x['Height'],weights=x['Volume']),
                                              'Stems':lambda x: np.average(x['Stems'],weights=x['Volume'])}).unstack()

这给了我错误:

builtins.KeyError: '高度'

我该如何解决这个问题?

【问题讨论】:

标签: python pandas


【解决方案1】:

您的错误是因为您无法使用agg 执行多个系列/列操作。 Agg 以一个系列/列为时间。让我们使用applypd.concat

g = df.groupby(['STAND_ID','Species'])
newdf = pd.concat([g.apply(lambda x: np.average(x['Height'],weights=x['Volume'])), 
                   g.apply(lambda x: np.average(x['Stems'],weights=x['Volume']))], 
                   axis=1, keys=['Height','Stems']).unstack()

编辑一个更好的解决方案:

g = df.groupby(['STAND_ID','Species'])
newdf = g.apply(lambda x: pd.Series([np.average(x['Height'], weights=x['Volume']), 
                             np.average(x['Stems'],weights=x['Volume'])], 
                                    index=['Height','Stems'])).unstack()

输出:

              Height                  Stems             
Species  Broadleaves    Conifer Broadleaves      Conifer
STAND_ID                                                
1               19.0  20.000000      2000.0  1500.000000
2                NaN  13.000000         NaN  1000.000000
3               24.0  24.363636      1200.0  1636.363636

【讨论】:

  • 为什么你说第二种解决方案更好?
  • @DL 老实说,我在 4 年前就做了这个答案,我不再相信第二个更好。我需要计算时间并考虑我现在知道的其他方法/食谱。
  • 我用groupby() 创建了两个数据框,然后实现了pd.join(),我认为这与您最初使用的concat() 方法最相似。性能(近似值):它在 0.1 秒内计算 10k 行。
猜你喜欢
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多