2017-08-28 90 views
1

我有一个5行和430列的DF。 我想将每列中的每个值乘以[5,4,3,2,1],除以每列中值的sum,并将相应的输出作为新行添加到每列中。添加一行到我的DF与一个结果值

在我的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 

其中值以下数学运算:

(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

我想你需要:

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 
相关问题