使用结果值向我的df添加一行

时间:2017-08-28 10:02:08

标签: pandas numpy

我有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?

1 个答案:

答案 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