添加具有几何平均值的列到pandas数据透视表

时间:2017-10-23 05:41:03

标签: pandas scipy pivot-table python-3.6

我有一个如下所示的数据透视表:

piv = pd.pivot_table(result, values=['mthly'], index=['year'], columns=['month'])

In [242]: piv
Out[242]: 
          mthly                                                              \
month        1         2         3         4         5         6         7    
year                                                                          
2011        NaN       NaN       NaN  0.015720 -0.008014 -0.006451 -0.001026   
2012   0.013018  0.007193  0.007137 -0.004187 -0.026664  0.007433  0.005807   
2013   0.013733 -0.005632  0.006883  0.015291 -0.016761  0.001125  0.012327   
2014  -0.013709  0.021567 -0.000728  0.003813  0.004264 -0.000426 -0.000268   
2015   0.003385  0.006475 -0.001917  0.000408 -0.000548 -0.009002  0.006698   
2016   0.005807  0.015684  0.006622  0.005657 -0.008455  0.018942  0.011761   
2017   0.007931  0.009863  0.003404  0.002660  0.011806 -0.000465  0.011023   


month        8         9         10        11        12  
year                                                     
2011   0.023813 -0.001507  0.002469  0.004392 -0.007492  
2012   0.004825  0.006059  0.006586  0.007239  0.013538  
2013  -0.010306  0.018834  0.013929  0.005148  0.009503  
2014   0.010237 -0.014682  0.008420  0.001743  0.003036  
2015  -0.022623 -0.006022 -0.000163 -0.000717 -0.002252  
2016  -0.002300 -0.001103 -0.004923  0.003658 -0.000372  
2017   0.000435  0.004498  0.004118       NaN       NaN  

如何添加具有几何平均值的列(使用scipy gmean)?

2 个答案:

答案 0 :(得分:2)

使用:

from scipy.stats.mstats import gmean

piv['Gmean'] = gmean(piv, axis=1)

要删除列中的MultiIndex,请移除[]

piv = pd.pivot_table(result, values='mthly', index='year', columns='month')

答案 1 :(得分:2)

我猜这些是回报,你想找到平均每月回报。在这种情况下,您需要先添加1,然后再添加gmean,然后减去1 ...并使用axis=1

from scipy.stats.mstats import gmean

df.assign(Gmean=gmean(df + 1, axis=1) - 1)

        mthly                                                   Gmean
month       1       2       3       4       5       6       7        
year                                                                 
2011      NaN     NaN     NaN  0.0157 -0.0080 -0.0065 -0.0010     NaN
2012   0.0130  0.0072  0.0071 -0.0042 -0.0267  0.0074  0.0058  0.0013
2013   0.0137 -0.0056  0.0069  0.0153 -0.0168  0.0011  0.0123  0.0038
2014  -0.0137  0.0216 -0.0007  0.0038  0.0043 -0.0004 -0.0003  0.0020
2015   0.0034  0.0065 -0.0019  0.0004 -0.0005 -0.0090  0.0067  0.0008
2016   0.0058  0.0157  0.0066  0.0057 -0.0085  0.0189  0.0118  0.0080
2017   0.0079  0.0099  0.0034  0.0027  0.0118 -0.0005  0.0110  0.0066

但是,您可以在不使用gmean的情况下执行此操作并考虑空值。

df.assign(Gmean=df.add(1).prod(1).pow(1 / df.notnull().sum(1), 0).sub(1))

        mthly                                                   Gmean
month       1       2       3       4       5       6       7        
year                                                                 
2011      NaN     NaN     NaN  0.0157 -0.0080 -0.0065 -0.0010  0.0000
2012   0.0130  0.0072  0.0071 -0.0042 -0.0267  0.0074  0.0058  0.0013
2013   0.0137 -0.0056  0.0069  0.0153 -0.0168  0.0011  0.0123  0.0038
2014  -0.0137  0.0216 -0.0007  0.0038  0.0043 -0.0004 -0.0003  0.0020
2015   0.0034  0.0065 -0.0019  0.0004 -0.0005 -0.0090  0.0067  0.0008
2016   0.0058  0.0157  0.0066  0.0057 -0.0085  0.0189  0.0118  0.0080
2017   0.0079  0.0099  0.0034  0.0027  0.0118 -0.0005  0.0110  0.0066