You can try to separate the different issues into dictionaries and then get the permutations:
>>> 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
Now let's create a dictionary with all the possible issues as keys and as values, a dictionary with all the possible rows this way:
>>> 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}]}
And next we can get all the permutations between the dictionarties this way:
>>> 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},...]
For the first combination we can obtain:
>>> 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'
It can all be joined this way:
>>> 'Combination_%d: %s'%(0,' = '.join([c1, c2, c3]))
'Combination_0: Bonus 10 + Assignment A + Leave 35 = 4000 + 0 + 1600 = 5600'
We can define a function to get all the strings from the list of combinations:
>>> 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',,...]