如何将“找零问题”应用于熊猫数据框?

时间:2020-04-30 21:29:38

标签: python pandas dataframe

以下问题通常被称为多个名称,并且有大量可用的文献资料。不幸的是,我是Python的新手,可以在将解决方案应用于我的案例时使用一些帮助。

我的熊猫数据框包含约40,000行,因此优化可能是一个因素。数据框包含几列目标代码,以及随之而来的美元金额列。我想证明这些美元金额的特定子集总计具有给定的价值。换句话说,我想证明以下内容:

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

大多数解决方案(包括this great solution,下面的代码)仅接受并返回值列表。我需要一个可以重现目标代码的解决方案。请指教,谢谢!

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 :(得分:0)

当您将自己的金额(总计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)])