【问题标题】:Pandas groupby mean absolute deviationPandas groupby 平均绝对偏差
【发布时间】:2013-12-21 18:39:29
【问题描述】:

我有一个这样的熊猫数据框:

Product Group    Product ID    Units Sold    Revenue    Rev/Unit
A                451           8             $16        $2
A                987           15            $40        $2.67
A                311           2             $5         $2.50
B                642           6             $18        $3.00
B                251           4             $28        $7.00

我想把它改成这样:

Product Group    Units Sold    Revenue    Rev/Unit   Mean Abs Deviation
A                25            $61        $2.44      $0.24
B                10            $46        $4.60      $2.00

Mean Abs Deviation 列将在第一个表中的 Rev/Unit 列上执行。棘手的是要考虑 Rev/Unit 计算背后的各自权重。

例如,对产品组 A 的 Rev/Unit 进行直接 MAD 将产生 0.26 美元。但是,考虑到重量后,MAD 为 0.24 美元。

我知道使用 groupby 来获得销售单位和收入的简单总和,但我对如何对接下来的 2 列进行更复杂的计算有点迷茫。

在我们提供建议/帮助的同时——有没有更简单的方法可以在 SO 帖子中创建/粘贴表格??

更新:

这样的解决方案会起作用吗?我知道它会用于求和字段,但不确定如何为后两个字段实现。

 grouped_df=df.groupby("Product Group")
 grouped_df.agg({
   'Units Sold':'sum',
   'Revenue':'sum',
   'Rev/Unit':'Revenue'/'Units Sold',
   'MAD':some_function})

【问题讨论】:

    标签: python-2.7 pandas


    【解决方案1】:

    您需要澄清“权重”是什么,我假设权重是售出的单位数量,但这给出的结果与您的不同:

    pv = df.pivot_table( rows='Product Group',
                         values=[ 'Units Sold', 'Revenue' ],
                         aggfunc=sum )
    pv[ 'Rev/Unit' ] = pv.Revenue / pv[ 'Units Sold' ]
    

    这给出了:

                   Revenue  Units Sold  Rev/Unit
    Product Group                               
    A                   61          25      2.44
    B                   46          10      4.60
    

    至于 WMAD:

    def wmad( prod ):
        idx = df[ 'Product Group' ] == prod
        w = df[ 'Units Sold' ][ idx ]
        abs_dev = np.abs ( df[ 'Rev/Unit' ][ idx ] - pv[ 'Rev/Unit' ][ prod ] )
        return sum( abs_dev * w ) / sum( w )
    
    pv[ 'Mean Abs Deviation' ] = [ wmad( idx ) for idx in pv.index ]
    

    正如我提到的,结果不同

                   Revenue  Units Sold  Rev/Unit  Mean Abs Deviation
    Product Group                                                   
    A                   61          25      2.44              0.2836
    B                   46          10      4.60              1.9200
    

    【讨论】:

    • 有没有办法在agg方法中插入一个函数?有关详细信息,请参阅编辑后的 ​​OP
    • 您可以使用 lambda 函数,如有必要,可以从中调用完整的函数。
    【解决方案2】:

    根据您建议的解决方案,您可以使用 lambda 函数对每一行进行操作,例如:

    'Rev/Unit': lambda x: calculate_revenue_per_unit(x)
    

    请记住,x 是每一行的元组,因此您需要在 calculate_revenue_per_unit 函数中解压缩它。

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多