Pandas: Как найти индексы значений между диапазоном - PullRequest
0 голосов
/ 29 мая 2020

У меня есть фрейм данных pandas с рядом чисел в столбце «Num».

import pandas as pd

numbers = np.array([10,15,60,45,37,28])
df = pd.DataFrame(numbers, columns= ['Num'])

Я бы нашел все комбинации индексов значений, которые удовлетворяют условию:

numbers1+numbers2+... >= 70% of df['Num'].sum()

df['Num'].sum() = 195, поэтому 136,5 - это 70%. Некоторые комбинации значений могут быть:

10+15+60 
15+60 
60+45+37
10+15+60+45+37+28 

и так далее. Я бы взял комбинации индексов и, в конце концов, получил бы комбинацию (/ ы), превышающую 70%, с наименьшим количеством индексов.

1 Ответ

1 голос
/ 29 мая 2020

Вы можете использовать itertools здесь:

import pandas as pd
import itertools
import numpy as np

numbers = np.array([10,15,60,45,37,28])
df = pd.DataFrame(numbers, columns= ['Num'])
total = int(df.sum())
list_n = list(df['Num'])
for L in range(0, len(list_n)+1):
    for subset in itertools.combinations(list_n, L):
        if sum(subset) > 0.7 * total:
            print(subset)

(60, 45, 37)
(10, 60, 45, 37)
(10, 60, 45, 28)
(15, 60, 45, 37)
(15, 60, 45, 28)
(15, 60, 37, 28)
(60, 45, 37, 28)
(10, 15, 60, 45, 37)
(10, 15, 60, 45, 28)
(10, 15, 60, 37, 28)
(10, 60, 45, 37, 28)
(15, 60, 45, 37, 28)
(10, 15, 60, 45, 37, 28)

Конечно, вы можете полностью пропустить pandas:

import itertools
import numpy as np

numbers = np.array([10,15,60,45,37,28])
total = sum(numbers)
for L in range(0, len(numbers)+1):
    for subset in itertools.combinations(numbers, L):
        if sum(subset) > 0.7 * total:
            print(subset)

(60, 45, 37)
(10, 60, 45, 37)
(10, 60, 45, 28)
(15, 60, 45, 37)
(15, 60, 45, 28)
(15, 60, 37, 28)
(60, 45, 37, 28)
(10, 15, 60, 45, 37)
(10, 15, 60, 45, 28)
(10, 15, 60, 37, 28)
(10, 60, 45, 37, 28)
(15, 60, 45, 37, 28)
(10, 15, 60, 45, 37, 28)
...