我想在我的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)]
行操作会让我失望 谢谢:))
答案 0 :(得分: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
答案 1 :(得分: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