Как применить «проблему смены монет» к pandas кадру данных? - PullRequest
0 голосов
/ 01 мая 2020

Следующая проблема часто называется несколькими именами и имеет много литературы. К сожалению, я немного новичок в Python и могу немного помочь с применением решения в моем случае.

У меня есть pandas фрейм данных, содержащий ~ 40000 строк, поэтому оптимизация, вероятно, является фактором. Фрейм данных содержит несколько столбцов объектных кодов и результирующий столбец сумм в долларах. Я хотел бы доказать, что определенное подмножество этих долларовых сумм составляет определенную стоимость. Другими словами, я хотел бы доказать следующее:

IN: 

Target: $11.72

Code1    Code2   Code3    Amount
RG22     331     ZAV      $2.00     
XG11     542     TAM      $4.23
RG22     117     GEE      $6.81
RG76     956     ZXA      $2.91
ZZ99     223     TTQ      $11.99
BW32     454     PBC      $9.35
OUT:

Code1    Code2   Code3    Amount
RG22     331     ZAV      $2.00   
RG22     117     GEE      $6.81
RG76     956     ZXA      $2.91

Большинство решений (включая это отличное решение , код ниже) только принимают и возвращают списки значений. Мне нужно решение, которое бы также воспроизводило объектные коды. Пожалуйста, сообщите, и спасибо!

def subset_sum(numbers, target, partial=[]):
    s = sum(partial)

    # check if the partial sum is equals to target
    if s == target: 
        print "sum(%s)=%s" % (partial, target)
    if s >= target:
        return  # if we reach the number why bother to continue

    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i+1:]
        subset_sum(remaining, target, partial + [n]) 


if __name__ == "__main__":
    subset_sum([3,9,8,4,5,7,10],15)

    #Outputs:
    #sum([3, 8, 4])=15
    #sum([3, 5, 7])=15
    #sum([8, 7])=15
    #sum([5, 10])=15

1 Ответ

0 голосов
/ 01 мая 2020

Если у вас есть суммы (которые в сумме составляют 11,72) в виде списка, например, полученные в результате:

def subset_sum(numbers, target, partial=[]):
    s = sum(partial)
    if s == target: 
        return partial
    if s > target:
        return None # if we reach the number why bother to continue
    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i+1:]
        result = subset_sum(remaining, target, partial + [n]) 
        if result:
            return result

amounts = subset_sum(df.Amount.tolist(), 11.72)

, вы можете легко отфильтровать строки, содержащие эти суммы:

print(df[df.Amount.isin(amounts)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...