2015-04-21 114 views
9

我试图创建一个新列,它返回同一df中现有列的值的平均值。但是,平均值应根据另外三列中的分组进行计算。熊猫dataframe条件.mean()取决于某些列中的值

Out[184]: 
    YEAR daytype hourtype scenario option_value  
0 2015  SAT  of_h   0  0.134499  
1 2015  SUN  of_h   1  63.019250  
2 2015  WD  of_h   2  52.113516  
3 2015  WD  pk_h   3  43.126513  
4 2015  SAT  of_h   4  56.431392 

我基本上是想有一个新列“平均”的计算“期权价值”的意思是,当“年”,“daytype”和“hourtype”是类似的。

我尝试以下方法,但都没有成功...

In [185]: o2['premium']=o2.groupby(['YEAR', 'daytype', 'hourtype'])['option_cf'].mean() 

TypeError: incompatible index of inserted column with frame index 
+1

你打电话给'['option_cf']',但你的数据帧有'['option_value']'。 – ASGM

+0

因此对于2015-SAT-of_h行,是否希望将它们折叠为一个新行,还是希望这两行仍然存在,但是具有(相同)平均值的“高级”列? – DSM

+0

事实上,两行仍然存在,但是具有相同平均值的“高级”列......但这就是下面提出的! – tpapz

回答

7

这里做一个方式,它

In [19]: def cust_mean(grp): 
    ....:  grp['mean'] = grp['option_value'].mean() 
    ....:  return grp 
    ....: 

In [20]: o2.groupby(['YEAR', 'daytype', 'hourtype']).apply(cust_mean) 
Out[20]: 
    YEAR daytype hourtype scenario option_value  mean 
0 2015  SAT  of_h   0  0.134499 28.282946 
1 2015  SUN  of_h   1  63.019250 63.019250 
2 2015  WD  of_h   2  52.113516 52.113516 
3 2015  WD  pk_h   3  43.126513 43.126513 
4 2015  SAT  of_h   4  56.431392 28.282946 

那么,发生了什么事错了你的企图?

它从原始数据框中返回具有不同形状的聚合。

In [21]: o2.groupby(['YEAR', 'daytype', 'hourtype'])['option_value'].mean() 
Out[21]: 
YEAR daytype hourtype 
2015 SAT  of_h  28.282946 
     SUN  of_h  63.019250 
     WD  of_h  52.113516 
       pk_h  43.126513 
Name: option_value, dtype: float64 

或者使用transform

In [1461]: o2['premium'] = (o2.groupby(['YEAR', 'daytype', 'hourtype'])['option_value'] 
           .transform('mean')) 

In [1462]: o2 
Out[1462]: 
    YEAR daytype hourtype scenario option_value premium 
0 2015  SAT  of_h   0  0.134499 28.282946 
1 2015  SUN  of_h   1  63.019250 63.019250 
2 2015  WD  of_h   2  52.113516 52.113516 
3 2015  WD  pk_h   3  43.126513 43.126513 
4 2015  SAT  of_h   4  56.431392 28.282946 
+1

非常感谢,它很好地工作。 尽管一个问题..你的方法怎么不会也返回一个聚合输出? – tpapz

1

你可以做到这一点,你通过调整你的代码通过以下方式希望的方式:

o2 = o2.set_index(['YEAR', 'daytype', 'hourtype']) 

o2['premium'] = o2.groupby(level=['YEAR', 'daytype', 'hourtype'])['option_value'].mean() 

为什么原来的错误?正如John Galt所解释的,来自groupby()。mean()的数据与原始DataFrame的形状(长度)不同。

如果您首先从索引中的“分组列”开始,熊猫可以巧妙地处理这个问题。然后它知道如何正确传播平均数据。

John的解决方案遵循相同的逻辑,因为groupby自然会在执行过程中将分组列自动放入索引中。