Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Numpy数组中获取数据帧列名_Python_Excel_Pandas_Numpy - Fatal编程技术网

Python 从Numpy数组中获取数据帧列名

Python 从Numpy数组中获取数据帧列名,python,excel,pandas,numpy,Python,Excel,Pandas,Numpy,我有一个从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 500

我有一个从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
现在我需要一种方法将数组中的salary值链接到数据框中的列名

所以我想要的输出是:

所需输出:

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

我建议重写
subsetsum
函数,以返回所选元素的索引,而不是元素本身(或者它可以同时返回这两个,如果这对您更有利的话)。比如说,

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

将返回
[0,1,2,3,4]
,或者可能返回
[0,1,2,4]
。然后,您可以使用这些索引访问相应的列标签以及元素。

使用您提供的所有信息,我在自己的机器上进行检查。 将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()
将匹配两个长度相同的数组,并返回一个
zip对象。然后,如果要迭代并使用print,请首先转换为
list()
。我希望这有帮助

我试过了,但都失败了,你能告诉我怎么做吗。求你了……这会是一个很大的帮助@cgmaster您尝试了什么,为什么失败了?我无法从函数中提取索引值。当我尝试单独提取值以便获得索引时,它不会抛出[2000][3000,2000][15000,3000,2000]。@cgmaster老实说,这对我一点帮助都没有。我不知道你所说的“从函数中提取索引值”是什么意思。