2016-12-28 8 views
1

からパンダDATAFRAMEの列名を取得します。私は、Excelからインポートデータフレームいる:numpyのアレイ

>>df 

    Name Emp ID Total Salary  A  B  C  D  E 
0 Mike A001   25000 5000 15000 3000  0 2000 
1 John A002   23000 5000 10000 3000 3000 2000 
2 Bob A003   21000 5000 15000  0 1000  0 
3 Rose A004   20000 5000 10000 2000 1000 20000 
4 James A005   10000 5000  0 3000  0 2000 

今私は、次のコードを使用して総給与のサブセットの合計を計算しています

コード:

import pandas as pd 
import numpy as np 

df = pd.read_excel('tmp/test.xlsx') 
val = df.drop(['Name','Emp ID','Total Salary'],1) 
test = np.array(val) 

num = df['Total Salary'][0] 
array = test[0] 

def subsetsum(array,num): 
    if num == 0 or num < 1: 
     return None 
    elif len(array) == 0: 
     return None 
    else: 
     if np.isclose(array[0],num): 
      return [array[0]] 
    else: 
     with_v = subsetsum(array[1:],(num - array[0])) 
     if with_v: 
      return [array[0]] + with_v 
     else: 
      return subsetsum(array[1:],num) 

print('\nValues : ',array) 
print('\nTotal Salary : ',num) 
print('\nValues of Salary : ',subsetsum(array,num)) 

出力:

Values : [ 5000 15000 3000  0 2000] 

Total Salary : 25000 

Values of Salary : [5000, 15000, 3000, 0, 2000] 

これで、配列にある給与の値をデータフレーム内の列名にリンクする方法が必要です。

だから私は希望私の出力は次のようになります。必要な

出力:

Values : [ 5000 15000 3000  0 2000] 

Total Salary : 25000 

Values of Salary : A - 5000 B - 15000 C - 3000 E - 2000 

答えて

1

私はインデックス選択した要素のを返すために、あなたのsubsetsum機能を書き換えるのではなく、示唆しています要素自体(あるいはおそらくそれがあなたにとってより良いものになる場合は、両方を返すことができます)。例えば、

subsetsum([5000, 15000, 3000, 0, 2000], 25000) 

[0, 1, 2, 3, 4]、または可能性[0, 1, 2, 4]を返します。次に、これらのインデックスを使用して、対応する列ラベルと要素にアクセスできます。

+0

私は試してみましたが、失敗しました。どうすればいいか教えてください。してください。それは大きな助けになるだろう! – cgmaster

+0

@cgmaster何を試しましたか?失敗した理由は何ですか? –

+0

関数からインデックス値を抽出できません。インデックスを取得できるように値を個別に抽出しようとすると、それは私にスローされます。なし [2000] [3000、2000] [15000,3000,2000]。 – cgmaster

1

ご提供いただいたすべての情報をもとに、自分のマシンでチェックします。 numpyの配列にdata.frameを変換する最も簡単な方法:値の名前と一致し、

col = val.columns.values 

最後に

test = val.values 
array = test[0] 

あなたは常に列名にアクセスすることができ

link = list(zip(col, subsetsum(array,num))) 
print(link) 

# Output 
[('A', 5000), ('B', 15000), ('C', 3000), ('D', 0), ('E', 2000)] 

zip()は、同じ長さの2つの配列と一致し、zip objectを返します。次に、印刷を繰り返し、使用する場合は、最初にlist()に変換します。私はこの助けて欲しい!

関連する問題