熊猫数据框条件 .mean() 取决于特定列中的值

Posted

技术标签:

【中文标题】熊猫数据框条件 .mean() 取决于特定列中的值【英文标题】:Panda dataframe conditional .mean() depending on values in certain column 【发布时间】:2015-06-28 23:28:15 【问题描述】:

我正在尝试创建一个新列,该列返回同一 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 

当“YEAR”、“daytype”和“hourtype”相似时,我基本上希望有一个新列“mean”来计算“option value”的平均值。

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

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

TypeError: incompatible index of inserted column with frame index

【问题讨论】:

您正在调用['option_cf'],但您的数据框有['option_value'] 因此,对于 2015-SAT-of_h 行,您是希望它们折叠成一个新行,还是希望两行仍然存在但有一个“高级”列(相同) 那里的平均值? 确实两行仍然存在,但具有相同平均值的“溢价”列..但这就是下面的建议! 【参考方案1】:

这是一种方法

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

【讨论】:

非常感谢,它运行良好。不过有一个问题.. 你的方法为什么不返回聚合输出?【参考方案2】:

您可以通过以下方式调整您的代码,按照您想要的方式进行操作:

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

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

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

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

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

【讨论】:

以上是关于熊猫数据框条件 .mean() 取决于特定列中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?

熊猫根据索引标签选择特定列中的值[重复]

根据熊猫中多列的条件(最大值)替换列中的值

熊猫数据框:在固定其他列的列中提取具有特定标准/条件最小值的数据[重复]

从熊猫数据框中的组内选择特定行

如何更新python中熊猫数据框特定列中的所有行?