【问题标题】:Permutations | Combinations | Python排列 |组合 | Python
【发布时间】:2018-02-17 07:51:26
【问题描述】:

我有一个如下所示的 DataFrame:

Issue       Options     Points
Bonus       10          4000
Bonus       8           3000
Bonus       6           2000
Bonus       4           1000
Bonus       2           0
Assignment  A           0
Assignment  B           -600
Assignment  C           -1200
Assignment  D           -1800
Assignment  E           -2400
Leave       35          1600
Leave       30          1200
Leave       25          800
Leave       20          400
Leave       15          0

有没有一种巧妙的方法来创建每个问题的不同组合?

理想的输出是这样的:

Combination_1: Bonus 10 + Assignment A + Leave 35 = 4000 + 0 + 1600 = 5600
Combination_2: Bonus 10 + Assignment A + Leave 30 = 4000 + 0 + 1200 = 5400
Combination_3: Bonus 10 + Assignment A + Leave 25 = 4000 + 0 + 800 = 4800
Combination_4: Bonus 10 + Assignment A + Leave 20 = 4000 + 0 + 400 = 4400
Combination_5: Bonus 10 + Assignment A + Leave 15 = 4000 + 0 + 0 = 4000

我想给每个组合打分,看看哪个是最强的选项

这可能与我的 DataFrame 的形状有关吗?

我尝试了以下方法:

stuff = ['10', '8', '6', '4', '2', 'A', 'B', 'C', 'D', 'E']

results = []

for combination in range(0, len(stuff) + 1):
    for subset in enumerate(itertools.combinations_with_replacement(stuff, combination)):
        results.append(subset)

但它给了我在这种情况下不可能的每一种组合,因为你只能选择一个问题,而不是多个问题。

【问题讨论】:

  • 您想打印如上的输出还是只是计算值?
  • 如果可能的话,两者都有?但独特的组合就足够了。我只是做了计算,以便更好地了解我想要实现的目标
  • 我会尽快发送我的代码。感谢您指出。
  • 如果您只是想看看哪种组合会产生更强的选择,而您只是将每个类别的值相加,为什么不选择每个类别的最大值并完成它呢?跨度>

标签: python pandas numpy combinations


【解决方案1】:

您可以尝试将不同的问题分成字典,然后得到排列:

>>> df

         Issue Options  Points
0        Bonus      10    4000
1        Bonus       8    3000
2        Bonus       6    2000
3        Bonus       4    1000
4        Bonus       2       0
5   Assignment       A       0
6   Assignment       B    -600
7   Assignment       C   -1200
8   Assignment       D   -1800
9   Assignment       E   -2400
10       Leave      35    1600
11       Leave      30    1200
12       Leave      25     800
13       Leave      20     400
14       Leave      15       0

现在让我们创建一个字典,其中包含所有可能的问题作为键和值,一个包含所有可能行的字典:

>>> d = {issue: df[df['Issue']==issue].copy().drop('Issue',
         axis=1).to_dict(orient='records') 
         for issue in df['Issue'].unique()}
>>> d
{'Assignment': [{'Options': 'A', 'Points': 0},
  {'Options': 'B', 'Points': -600},
  {'Options': 'C', 'Points': -1200},
  {'Options': 'D', 'Points': -1800},
  {'Options': 'E', 'Points': -2400}],
 'Bonus': [{'Options': '10', 'Points': 4000},
  {'Options': '8', 'Points': 3000},
  {'Options': '6', 'Points': 2000},
  {'Options': '4', 'Points': 1000},
  {'Options': '2', 'Points': 0}],
 'Leave': [{'Options': '35', 'Points': 1600},
  {'Options': '30', 'Points': 1200},
  {'Options': '25', 'Points': 800},
  {'Options': '20', 'Points': 400},
  {'Options': '15', 'Points': 0}]}

接下来我们可以通过这种方式得到字典之间的所有排列:

>>> from itertools import product
>>> combinations = [dict(zip(d, v)) for v in product(*d.values())]
>>> combinations
[{'Assignment': {'Options': 'A', 'Points': 0},
  'Bonus': {'Options': '10', 'Points': 4000},
  'Leave': {'Options': '35', 'Points': 1600}},
 {'Assignment': {'Options': 'A', 'Points': 0},
  'Bonus': {'Options': '10', 'Points': 4000},
  'Leave': {'Options': '30', 'Points': 1200}},
 {'Assignment': {'Options': 'A', 'Points': 0},...]

对于第一个组合我们可以得到:

>>> issues = df['Issue'].unique()

>>> issues
array(['Bonus', 'Assignment', 'Leave'], dtype=object)

>>> c1 = ' + '.join([issue + ' %s'%combinations[0][issue]['Options'] 
                     for issue in issues])

>>> c1 
'Bonus 10 + Assignment A + Leave 35'

>>> c2 = ' + '.join([' %s'%combinations[0][issue]['Points'] for issue in issues])

>>> c2
' 4000 +  0 +  1600'

# Eval ' 4000 +  0 +  1600' to obtain the sum

>>> c3 = str(eval(c2))

>>> c3
'5600'

都可以这样加入:

>>> 'Combination_%d: %s'%(0,' = '.join([c1, c2, c3]))
'Combination_0: Bonus 10 + Assignment A + Leave 35 =  4000 +  0 +  1600 = 5600'

我们可以定义一个函数从组合列表中获取所有字符串:

>>> def get_output(i,combination, issues):                       
        c1 = ' + '.join([issue + ' %s'%combination[issue]['Options']
                         for issue in issues])
        c2 = ' + '.join([' %s'%combination[issue]['Points'] 
                         for issue in issues])
        c3 = str(eval(c2))
        return 'Combination_%d: %s'%(i,' = '.join([c1, c2, c3]))

>>> [get_output(i+1,c, issues) for i, c in enumerate(combinations)]

['Combination_1: Bonus 10 + Assignment A + Leave 35 =  4000 +  0 +  1600 = 5600',
 'Combination_2: Bonus 10 + Assignment A + Leave 30 =  4000 +  0 +  1200 = 5200',
 'Combination_3: Bonus 10 + Assignment A + Leave 25 =  4000 +  0 +  800 = 4800',
 'Combination_4: Bonus 10 + Assignment A + Leave 20 =  4000 +  0 +  400 = 4400',
 'Combination_5: Bonus 10 + Assignment A + Leave 15 =  4000 +  0 +  0 = 4000',
 'Combination_6: Bonus 10 + Assignment B + Leave 35 =  4000 +  -600 +  1600 = 5000',
 'Combination_7: Bonus 10 + Assignment B + Leave 30 =  4000 +  -600 +  1200 = 4600',
 'Combination_8: Bonus 10 + Assignment B + Leave 25 =  4000 +  -600 +  800 = 4200',
 'Combination_9: Bonus 10 + Assignment B + Leave 20 =  4000 +  -600 +  400 = 3800',
 'Combination_10: Bonus 10 + Assignment B + Leave 15 =  4000 +  -600 +  0 = 3400',,...]

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
相关资源
最近更新 更多