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

Pandas 将具有几何平均值的列添加到数据透视表,pandas,scipy,pivot-table,python-3.6,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

我有一个透视表,如下所示:

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)?

使用:

from scipy.stats.mstats import gmean

piv['Gmean'] = gmean(piv, axis=1)
对于删除列中的删除多索引,[]:

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

对于删除列中的删除多索引,[]:

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

我猜这些都是回报,你想找到平均月回报。在这种情况下,您需要先加1,然后再减去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

我猜这些都是回报,你想找到平均月回报。在这种情况下,您需要先加1,然后再减去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

我可以改进您的pivot代码,您可以将其添加到问题中吗?你如何获得有问题的数据?谢谢。添加了数据透视表创建行。我可以改进您的数据透视代码,您可以将其添加到问题中吗?你如何获得有问题的数据?谢谢。添加了数据透视表创建lineMath guy;)所以
gmean
only是错的?或者这取决于OP需要什么?不能用负值进行gmean。我看到几个月和一些小数字在零左右波动,我认为回报率是。几何回报率只是加强了我的假设。因此,我添加了一个,这一切都是有意义的。我可能错了,但是。。。我们拭目以待。是的。他们是回报,你是对的。谢谢还有一个问题。为了获得几何回报(累积回报),我尝试了piv['Yearal']=(piv+1).cumprod(axis=1)-1,但得到了'ValueError:通过的项目数错误12,放置意味着1'。我做错了什么?数学人;)所以
gmean
only是错的?或者这取决于OP需要什么?不能用负值进行gmean。我看到几个月和一些小数字在零左右波动,我认为回报率是。几何回报率只是加强了我的假设。因此,我添加了一个,这一切都是有意义的。我可能错了,但是。。。我们拭目以待。是的。他们是回报,你是对的。谢谢还有一个问题。为了获得几何回报(累积回报),我尝试了piv['Yearal']=(piv+1).cumprod(axis=1)-1,但得到了'ValueError:通过的项目数错误12,放置意味着1'。我做错了什么?