我有5行和430列的df。
我希望将列中的每个值乘以[5,4,3,2,1]
,除以每列中值的sum
,并将相应的输出添加为每列的新行。
我的df看起来像这样:
df1=
CO2 SO4 SE6 NH1
test1 4.0 1.0 8.0 0.0 ..
test2 10.0 1.0 3.0 4.0 ..
test3 11.0 6.0 4.0 1.0 ..
test4 0.0 11.0 0.0 1.0 ..
test5 1.0 6.0 0.0 1.0 ..
我想要以下输出:
CO2 SO4 SE6 NH1
test1 4.0 1.0 8.0 0.0 ..
test2 10.0 1.0 3.0 4.0 ..
test3 11.0 6.0 4.0 1.0 ..
test4 0.0 11.0 0.0 1.0 ..
test5 1.0 6.0 0.0 1.0 ..
rank value value value value
其中value是以下数学运算:
(test1*5 + test2*4 + test3*3 + test4*2 + test5*1)/(test1+test2+test3+test4+test5)
这就是我的尝试:
for i in range(len(df1.columns)):
rank= np.dot(df1.iloc[:,i],[5,4,3,2,1])/np.sum(df1.iloc[:,i])
(df1.iloc[:,i]).loc['rank']=rank
print(df1)
然而,它输出初始输入。
如何返回最后一行rank
的df?
答案 0 :(得分:1)
我认为你需要:
a = [5,4,3,2,1]
df1.loc['rank'] = df1.T.dot(a).div(df1.sum())
print (df1)
CO2 SO4 SE6 NH1
test1 4.000000 1.0 8.000000 0.000000
test2 10.000000 1.0 3.000000 4.000000
test3 11.000000 6.0 4.000000 1.000000
test4 0.000000 11.0 0.000000 1.000000
test5 1.000000 6.0 0.000000 1.000000
rank 3.615385 2.2 4.266667 3.142857
验证
for i in range(len(df1.columns)):
rank= np.dot(df1.iloc[:,i],[5,4,3,2,1])/np.sum(df1.iloc[:,i])
print (rank)
3.61538461538
2.2
4.26666666667
3.14285714286