Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Panda dataframe conditional.mean()取决于特定列中的值_Python_Pandas_Conditional_Mean - Fatal编程技术网

Python Panda dataframe conditional.mean()取决于特定列中的值

Python Panda dataframe conditional.mean()取决于特定列中的值,python,pandas,conditional,mean,Python,Pandas,Conditional,Mean,我试图创建一个新列,它返回同一df中现有列的值的平均值。但是,应根据其他三列中的分组计算平均值 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

我试图创建一个新列,它返回同一df中现有列的值的平均值。但是,应根据其他三列中的分组计算平均值

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 
我基本上希望有一个新的列‘mean’,当‘YEAR’、‘daytype’和‘hourtype’相似时,它计算‘期权价值’的平均值

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

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

TypeError: incompatible index of inserted column with frame index

这里有一个方法

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
使用
变换

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

通过以下方式调整代码,您可以按照预期的方式执行此操作:

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

o2['premium'] = o2.groupby(level=['YEAR', 'daytype', 'hourtype'])['option_value'].mean()
为什么会出现最初的错误?正如John Galt所解释的,来自groupby().mean()的数据与原始数据帧的形状(长度)不同

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


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

您正在调用
['option\u cf']
,但您的数据帧具有
['option\u value']
。因此,对于2015-SAT-of\u h行,是否希望将它们折叠成一个新行,或者您希望这两行仍然存在,但其中有一个平均值相同的“高级”列?实际上,这两行仍然存在,但有一个平均值相同的“高级”列。。但这正是下面的建议!非常感谢,它工作得很好。但有一个问题。。为什么您的方法不同时返回聚合输出?