Python 有没有办法确定哪种值的组合会导致一列的总和最小?

Python 有没有办法确定哪种值的组合会导致一列的总和最小?,python,pandas,numpy,scipy,Python,Pandas,Numpy,Scipy,我有一个数据框,有6列,其中5列的值为0或1。我想知道哪些列(当每行==1或==0时)一起或组合在一起会导致列“Target DF”中的总和最小。例如,关于以下数据,如果col1==1和col2==1,则目标Df中的值之和为0.37%,但如果col1==1和col2==1和col3==1则目标Df中的值之和为0.08%。有没有什么好方法可以测试哪种组合的总和最低 Target DF col1 col2 col3 col4 col5 1 -0.0002908

我有一个数据框,有6列,其中5列的值为
0
1
。我想知道哪些列(当每行==1或==0时)一起或组合在一起会导致列
“Target DF”
中的总和最小。例如,关于以下数据,如果
col1==1
col2==1
,则
目标Df
中的值之和为0.37%,但如果
col1==1
col2==1
col3==1
目标Df
中的值之和为0.08%。有没有什么好方法可以测试哪种组合的总和最低

    Target DF   col1    col2    col3    col4    col5
1   -0.0002908206429779181  1   0   0   0   1
2   -0.00020275213991660657 1   0   0   0   0
3   0.00020279325668326464  1   1   1   1   0
4   0.00010578372517389134  0   0   0   1   1
5   -0.00029087447444264836 0   1   0   0   0
6   0.0002027896806502394   0   1   0   0   1
7   -0.00012341217020306328 1   0   0   0   1
8   -0.0003350172357550196  0   1   1   1   1
9   0.0003439487075465042   0   0   1   1   1
10  -8.816165320779668e-06  0   1   0   0   0
11  0.000440812152309622    1   1   0   0   0
12  0.000890048203600724    0   1   0   0   1
13  0.0007043617602000563   0   1   0   0   0
14  0.00036952964155623214  0   0   1   0   1
15  0.00032541776605099493  0   0   1   1   0
16  -0.00036048075824046677 0   0   0   1   1
17  0.0001407261469179577   1   0   0   0   0
18  -2.638243984798283e-05  1   1   1   0   1
19  0.0003429807666939233   0   1   0   0   1
20  0.00011428772374011409  1   0   1   0   0
21  0.000290081838239864    0   0   1   1   1
22  0.0007293881926990764   1   1   0   0   0
23  -0.00010537685397415952 0   0   1   1   1
24  0.0001229526193300412   0   1   1   0   1
25  0.0007727500241483387   1   0   1   1   1
26  1.754893960548287e-05   0   0   1   1   1
27  -3.509726329098406e-05  1   1   1   0   1
28  -0.00025446408985230207 0   1   0   0   0
29  -0.00046517343069785166 1   0   1   1   0
30  -0.00017561883687644553 1   0   0   0   0
31  -0.00013173726320236945 0   1   1   0   0
32  -0.0004391820673177449  0   0   1   1   0
33  -0.0002812000210901111  0   1   0   0   0
34  0.00014942953079133403  0   0   1   1   0
35  -0.00014061854582836375 1   1   0   0   0
36  0.00020216758814073366  0   0   0   1   1
37  -0.0004745583970471312  1   0   1   1   0
38  -0.00014946894562850588 1   0   1   0   0
39  -0.00010552326348267638 1   1   1   1   0
40  -0.0004836993324949246  0   1   1   0   0
41  0.0003343539928906125   0   1   0   1   1
42  0.00035183393438287247  0   1   1   0   0
43  8.792754770059474e-06   0   0   0   0   0
44  -0.0007737556163227577  1   1   1   0   1
45  -0.0004751722499405364  0   1   0   1   0
46  0.0006074531864879162   1   1   0   0   0
47  0.00013197487198435276  1   0   0   0   1
48  -0.0005982071380187248  0   0   1   0   1
49  0.000668984639760728    1   1   0   1   1
50  0.0007037235773789119   1   1   1   1   1
51  0.0005105588859253274   1   1   1   1   1
52  0.0005278948433471431   0   0   0   1   0
53  0.00041373603640870726  0   1   1   0   0
54  0.0005988445822178168   0   0   0   1   0
55  0.0006512937863052404   1   1   0   0   1
56  6.156877231866531e-05   0   0   1   0   1
57  0.00029906673586244104  1   1   1   0   0

您需要按所有
组合进行分组

从itertools导入组合

cols = ['col1','col2','col3','col4','col5']

max_val, max_combine, max_name = None, None, None
for i in range(len(cols)):
    for sub in combinations(cols,i+1):
        k = df.groupby(list(sub))['Target DF'].sum()
        
        # find the maximum
        val = k.max()
        if max_val is None or max_val < val:
            max_val, max_combine, max_name = val, k.idxmax(), sub
        
print('max Target', max_val, 'at', max_name, 'with value',max_combine)

itertools.排列
谢谢,保罗。我以前使用过排列,但我看不出这将如何帮助我解决问题(除非获得所有排列)。请查看一个解决方案,以避免使用所有组合所需的指数时间(对于较大的
n
列非常有用)。那里的解决方案比这里的O(2^n)要快得多。这太棒了@PierreD。非常感谢与您的推荐人联系!这简直太神奇了。谢谢你广花时间帮我解决这个问题!:)与我的“天真解决方案”惊人地相似。。。
max Target 0.004834 at ('col2',) with value 1