我有从excel导入的数据框:
>>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
答案 0 :(得分:1)
我建议重写你的subsetsum
函数来返回所选元素的 indices ,而不是元素本身(或者它可以返回两者,如果这样可以更好为了你)。例如,
subsetsum([5000, 15000, 3000, 0, 2000], 25000)
会返回[0, 1, 2, 3, 4]
,或者可能会[0, 1, 2, 4]
。然后,您可以使用这些索引来访问相应的列标签以及元素。
答案 1 :(得分:1)
使用您提供的所有信息,我在自己的机器上查看。 将data.frame转换为numpy数组的最简单方法:
test = val.values
array = test[0]
您始终可以访问列名
col = val.columns.values
最后,将名称与值匹配
link = list(zip(col, subsetsum(array,num)))
print(link)
# Output
[('A', 5000), ('B', 15000), ('C', 3000), ('D', 0), ('E', 2000)]
zip()
将匹配2个长度相同的数组,并返回zip object
。然后,如果要迭代并使用print,请先转换为list()
。我希望这有帮助!