У меня есть фрейм данных pandas, который выглядит так:
party seats
A 34
B 26
C 19
D 12
E 10
Всего всегда 101 место. Мне нужно получить список всех возможных комбинаций партий, имеющих вместе 51 и более мест.
Например,
[A, B]
[A, C]
[A, B, C]
[A, B, D]
...
[A, B, C, D, E]
или что-то в этом роде. Любая помощь или советы будут высоко оценены.
Если количество строк не слишком велико, вы можете перебрать его. Для n
строк есть 2^n
подмножества, которые вам нужны для вычисления суммы.
Ознакомьтесь с рецептом мощность в документации itertools. Он использует цепь и комбинации.
Поскольку вы упомянули «все комбинации», я думаю, вы не ищете одно оптимальное решение. Единственной возможностью было бы перебором и генерированием всех комбинаций сторон и выбором тех, у которых сумма больше 51.
Вот один из способов сделать это.
import pandas as pd
import numpy as np
import itertools
# Data Generation
alphabets = [chr(i) for i in range(ord('a'),ord('z')+1)]
party_size = 6
seats = 51
df = pd.DataFrame(np.random.randint(20,100,party_size), index=alphabets[:party_size])
#Algo
parties = df.index
a = []
for r in range(parties.shape[0]): # Generate combinations
ls = list(itertools.combinations(parties, r))
ls1 = [inx for inx in ls if df.loc[inx,:].sum()[0] > seats] # Choose only what qualifies
a.extend(ls1) # Generate master list
Изучите «задачу о рюкзаке».