熊猫数据框条件 .mean() 取决于特定列中的值
Panda dataframe conditional .mean() depending on values in certain column
我正在尝试创建一个新列,其中 returns 来自同一 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' 来计算 "option value" 的平均值,当 "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
那么,您的尝试出了什么问题?
它 returns 是一个与原始数据框形状不同的聚合体。
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
您可以通过以下方式调整代码来按照您的预期方式进行操作:
o2 = o2.set_index(['YEAR', 'daytype', 'hourtype'])
o2['premium'] = o2.groupby(level=['YEAR', 'daytype', 'hourtype'])['option_value'].mean()
为什么原来的错误?正如 John Galt 所解释的,来自 groupby().mean() 的数据与原始 DataFrame 的形状(长度)不同。
如果您首先从索引中的 'grouping columns' 开始,Pandas 可以巧妙地处理这个问题。然后它知道如何正确传播平均数据。
John 的解决方案遵循相同的逻辑,因为 groupby 在执行期间自然地将分组列放在索引中。
我正在尝试创建一个新列,其中 returns 来自同一 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' 来计算 "option value" 的平均值,当 "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
那么,您的尝试出了什么问题?
它 returns 是一个与原始数据框形状不同的聚合体。
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
您可以通过以下方式调整代码来按照您的预期方式进行操作:
o2 = o2.set_index(['YEAR', 'daytype', 'hourtype'])
o2['premium'] = o2.groupby(level=['YEAR', 'daytype', 'hourtype'])['option_value'].mean()
为什么原来的错误?正如 John Galt 所解释的,来自 groupby().mean() 的数据与原始 DataFrame 的形状(长度)不同。
如果您首先从索引中的 'grouping columns' 开始,Pandas 可以巧妙地处理这个问题。然后它知道如何正确传播平均数据。
John 的解决方案遵循相同的逻辑,因为 groupby 在执行期间自然地将分组列放在索引中。