我试图按行获取几何平均值,DataFrame看起来像这样:
PLTRNSU00013 PLSRBEX00014 PLATTFI00018 PLALMTL00023 PLAMBRA00013 PLAMICA00010 PLAMPLI00019 NL0000474351 PLAPATR00018 PLAPLS000016
2010-07-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2010-10-01 NaN NaN NaN NaN NaN NaN NaN 0.968237 NaN NaN
2011-01-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2011-04-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2011-07-01 0.979871 NaN NaN NaN NaN NaN NaN 1.00999 NaN NaN
2011-10-01 NaN NaN NaN NaN NaN 1.00737 NaN NaN NaN NaN
2012-01-01 NaN NaN NaN NaN NaN NaN NaN NaN 1.05766 NaN
2012-04-01 NaN NaN NaN NaN NaN NaN NaN NaN 0.979955 NaN
2012-07-01 NaN NaN NaN NaN NaN NaN NaN NaN 1.01718 NaN
2012-10-01 NaN 0.916302 NaN NaN NaN NaN NaN 0.979858 NaN NaN
我没有找到任何内置的pandas方法,所以我使用的是scipy中的gmean
from scipy.stats.mstats import gmean
但是当在行上调用时:
In [285]:gmean(DataFrame.loc['2015-10-01'])
Traceback (most recent call last):
File "<ipython-input-28-e9186c65a04d>", line 1, in <module>
gmean(DataFrame.loc['2015-10-01'])
File "D:\Python\lib\site-packages\scipy\stats\stats.py", line 305, in gmean
log_a = np.log(np.array(a, dtype=dtype))
AttributeError: 'float' object has no attribute 'log'
我正在接受并且例外AttributeError
我尝试用{p>摆脱Nan
In [287]: gmean(DataFrame.loc['2015-10-01'].dropna())
Traceback (most recent call last):
File "<ipython-input-29-e8807696d6be>", line 1, in <module>
gmean(DataFrame.loc['2015-10-01'].dropna())
File "D:\Python\lib\site-packages\scipy\stats\stats.py", line 305, in gmean
log_a = np.log(np.array(a, dtype=dtype))
AttributeError: 'numpy.float64' object has no attribute 'log'
我可以使用math
pow
方法手动执行此操作,但是当然,它效率很低,仅适用于标量。
答案 0 :(得分:1)
我们可以通过<div class="abouts">
<!-- ITEM -->
<div class="item">
<h3>Vision</h3>
<p>Content here details, more content height...</p>
</div>
<!--/ ITEM -->
<!-- ITEM -->
<div class="item">
<h3>Vision</h3>
<p>Content here details...</p>
</div>
<!--/ ITEM -->
<!-- ITEM -->
<div class="item">
<h3>Vision</h3>
<p>Content here details, more content for test equal height all elements more content for test equal height all elements...</p>
</div>
<!--/ ITEM -->
</div>
手动完成此操作:
numpy
输出:
np.exp(np.log(df.prod(axis=1))/df.notna().sum(1))
答案 1 :(得分:1)
不确定,为什么gmean对您不起作用。您是否已经检查了列的数据类型?他们可能不是np.float32或np.float64吗?
像Quang Hoang提出的解决方案可以工作,但我猜只有在产品不产生溢出的情况下才可以。我想像gmean取日志,对结果求和,建立平均值并返回e ^(average)。
如果愿意,您当然可以手动执行此操作。之前删除NA(或使用只忽略它们的索引器)。
所以它就像:
import numpy as np
values= your_df.loc[your_id]
indexer= ~values.isna()
avg_log=values[indexer].map(np.log).mean()
np.exp(avg_log)
如果使用此方法,请确保至少使用np.float64作为对数和均值运算。