DataFrame中的几何平均值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

我试图在行中获得几何平均值,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 buildin方法,所以我使用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 我试图摆脱的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方法手动完成,但是从外观来看效率非常低,它只适用于标量。

提问于
用户回答回答于

我们可以手动完成numpy

np.exp(np.log(df.prod(axis=1))/df.notna().sum(1))

输出:

2010-07-01         NaN
2010-10-01    0.968237
2011-01-01         NaN
2011-04-01         NaN
2011-07-01    0.994817
2011-10-01    1.007370
2012-01-01    1.057660
2012-04-01    0.979955
2012-07-01    1.017180
2012-10-01    0.947547
dtype: float64
用户回答回答于

不确定,为什么gmean不适合你。您是否已检查过列的数据类型?他们可能不是np.float32或np.float64?

像Quang Hoang提出的解决方案可以工作,但我想只有产品不会产生溢出。我想看看gmean取日志,总结结果,建立平均值并返回e ^(平均值)。

如果你愿意的话,你当然可以手工做。之前删除NAs(或使用仅忽略它们的索引器)。

所以它会是这样的:

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作为日志和平均值。

扫码关注云+社区

领取腾讯云代金券