Как я могу найти комбинацию строк из таблицы, где каждый столбец суммирует определенное число c (или диапазон)? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть таблица с тремя столбцами. Допустим, первый ряд заполнен именами некоторых людей. Второе и третье - числа, представляющие ценность, которую они потратили. Я хочу построить другую таблицу с подмножеством тех людей, где сумма из каждого столбца этой новой таблицы дает конкретное значение c. Как это сделать в Python?

Пример: это моя таблица

Col1       Col2   Col3
John       10     100
Andrew     5      50
Martha     8      20
Ana        2      5

Допустим, я хотел получить комбинацию, в которой сумма второго столбца равна 20, а третьего - 125. Результат будет:

Col1       Col2   Col3
John       10     100
Martha     8      20
Ana        2      5

Примечание. Конечно, иногда бывает невозможно получить точную сумму. Если код принимает некоторую аппроксимацию, например, от 0,9X до 1,1X, если X - желаемая сумма, это было бы просто замечательно. Кроме того, мне не нужно получать указанное c количество строк. Это может быть комбинация 2, 3, ..., n.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Распространение на решение @ stanna: мы можем создать все возможные комбинации отбрасываемых строк, используя iterables.combinations() и проверить, удовлетворены ли наши требования

def checkRequirements(sum1, sum2):
  if sum1 == 20 and sum2 == 125:
    return True
  else:
    return False

# first check if the df as a whole satisfy the requirement
if checkRequirements(df['Col2'].sum(), df['Col3'].sum()) == True:
    print(df)
else:
    # create multiple combination of rows and drop them and check if they satisfy the requriement
    for r in range(1, len(df.index)):
        drop_list = list(combinations(list(df.index), r))
        for idx in drop_list:
            temp_df = df.drop(list(idx))
            if checkRequirements(temp_df['Col2'].sum(), temp_df['Col3'].sum()) == True:
                print(temp_df)
                break

Вывод:

     Col1  Col2  Col3
0    John    10   100
2  Martha     8    20
3     Ana     2     5

Удалите break stmt в конце, если вы хотите напечатать все соответствующие подмножества

1 голос
/ 13 марта 2020

Это задача алгоритма c - найти комбинацию значений, которая соответствует необходимым критериям. Для несложных задач вы можете использовать следующий скрипт, который удаляет строку за строкой в ​​кадре данных и проверяет, соответствует ли комбинация сумм столбца необходимым критериям. Однако сценарий должен быть разработан на тот случай, если вы хотите продолжить удаление строк (т.е. удалить две строки, если после попытки удалить одну строку совпадение не было найдено). Здесь должен быть реализован указанный алгоритм c (то есть, какие две строки нужно удалить и в каком порядке?), И может быть очень большое количество комбинаций в зависимости от сложности ваших данных.



#sample dataframe
d = {'Column1': ["John", "Andrew", "Martha", "Ana"], 'Column2': [10, 5, 8, 2], 'Column3': [100, 50, 20, 5]}
df = pd.DataFrame(data=d)

#count the sum of each column
totalColumn2 = df['Column2'].sum()
totalColumn3 = df['Column3'].sum()

#function to check if sums of columns match the requrements
def checkRequirements():
  if totalColumn2 == 20 and totalColumn3 == 125:  #vsums of each column
    return True
  else:
    return False

#iterating through dataframe, removing rows and checking the match
ind = 0
for i, row in df.iterrows():
  df1 = df.drop(df.index[ind])
  totalColumn2 = df1['Column2'].sum()
  totalColumn3 = df1['Column3'].sum()
  checkRequirements()
  if checkRequirements() is True:
    print(df1)
    break
  ind = ind+1

...