2017-08-28 9 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 
関連する問題