2017-08-28 88 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 
相關問題