大熊猫添加均值和方差列

问题描述 投票:0回答:2

我想在我的df中添加加权平均列和权重std dev:

[Existing df....]  [New columns to add in existing df i.e df[Mean] & df[StdDev]] 
Name  1  2  3  4    Mean                              StdDev 
x     2  2  2  2    m1=(2*1+2*2+2*3+2*4)/(2+2+2+2)   sqrt[(2*(1-m1)^2+2*(2-m1)^2+2*(3-m1)^2+2*(4-m1)^2)/(2+2+2+2)]
y     3  3  3  3    m2=(3*1+3*2+3*3+3*4)/(3+3+3+3)   sqrt[(3*(1-m2)^2+3*(2-m2)^2+3*(3-m2)^2+3*(4-m2)^2)/(3+3+3+3)]
z     1  3  5  7    m3=(1*1+3*2+5*3+7*4)/(1+3+4+7)   sqrt[(1*(1-m3)^2+3*(2-m3)^2+5*(3-m3)^2+7*(4-m3)^2)/(1+3+4+7)]

行操作会让我失望。 谢谢 :)

python pandas mean standard-deviation
2个回答
1
投票

通过使用numpy

df=df.set_index('Name')
df.columns=df.columns.astype(int)

Mean=np.sum(df.values*df.columns.values,1)/np.sum(df.values)
Std=np.sum(np.power(df.columns.values-Mean[:,None],2)*df.values,1)/df.values.sum(1)

df.assign(Mean=Mean,Std=np.sqrt(Std.astype(float)))
Out[523]: 
      1  2  3  4      Mean       Std
Name                                
x     2  2  2  2  0.555556  2.242959
y     3  3  3  3  0.833333  2.006932
z     1  3  5  7  1.388889  1.968110

1
投票

没有比这更容易..

import pandas as pd
import numpy as np

np.random.seed(42)

df = pd.DataFrame(np.random.rand(10, 4), columns=np.asarray([1, 2, 3, 4]))

mus = (df * df.columns.values).sum(1) / df.sum(1)
# Calculations for stds
#stds = 

df['weighted_mu'] = mus
#df['weighted_std'] = stds

print(df)

输出:

          1         2         3         4  weighted_mu
0  0.374540  0.950714  0.731994  0.598658     2.585401
1  0.156019  0.155995  0.058084  0.866176     3.322052
2  0.601115  0.708073  0.020584  0.969910     2.591077
3  0.832443  0.212339  0.181825  0.183405     1.798719
4  0.304242  0.524756  0.431945  0.291229     2.457527
5  0.611853  0.139494  0.292145  0.366362     2.292949
6  0.456070  0.785176  0.199674  0.514234     2.394891
7  0.592415  0.046450  0.607545  0.170524     2.251373
8  0.065052  0.948886  0.965632  0.808397     2.902943
9  0.304614  0.097672  0.684233  0.440152     2.825275
© www.soinside.com 2019 - 2024. All rights reserved.