使用Pandas Dataframe的子集总和

时间:2016-12-27 06:20:35

标签: python pandas

这是我用于使用

计算子集的代码

代码

private static readonly Lazy<Locator> _locator = new Lazy<Locator>(() => new Locator(), LazyThreadSafetyMode.PublicationOnly);
            public static Locator Instance => _locator.Value;

整数值的输出

import numpy as np
array = np.array([15,1,4,6,3,10,4.2])
num = 8.2

def subsetsum(array,num):

    if num == 0 or num < 1:
        return None
    elif len(array) == 0:
        return None
    else:
        if array[0] == num:
            return [array[0]]
        else:
            with_v = subsetsum(array[1:],(num - array[0])) 
            if with_v:
                return [array[0]] + with_v
            else:
                return subsetsum(array[1:],num)

print('\nList of Values : ',array)
print('\nSum Desired : ',num)
print('\nValues that add up to sum : ',subsetsum(array,num))

现在,我如何使用PANDAS Dataframe而不是使用Numpy Array来实现相同的功能?

1 个答案:

答案 0 :(得分:1)

您可以通过将np.array替换为pd.Series并在.iloc之后添加array来逐字翻译,以按位置使用索引。这就是我在下面所做的。

顺便说一句,你真的想在那里有整数。如果数字是以小数位数给出的,则使用round(x*100)之类的内容转换为整数。试图实现浮点数和的相等是令人沮丧的一个因素:0.1 + 0.2 == 0.3是假的。

最重要的是:在这里使用Pandas没有任何优势。它是一个用于分析数据的模块,而不是用于解决组合问题的模块。它使用NumPy,所以你得到的是一个较慢的代码,带有Pandas索引数据层的额外开销。

如果你想提高代码的性能,我建议在开始之前按降序对数组进行排序,这样太大的使用值就会很快被移除。

import pandas as pd
array = pd.Series([15,1,4,6,3,10,4])
num = 8

def subsetsum(array,num):

    if num == 0 or num < 1:
        return None
    elif len(array) == 0:
        return None
    else:
        if array.iloc[0] == num:
            return [array.iloc[0]]
        else:
            with_v = subsetsum(array.iloc[1:], (num - array.iloc[0]))
            if with_v:
                return [array.iloc[0]] + with_v
            else:
                return subsetsum(array.iloc[1:],num)

print('\nList of Values : ',array)
print('\nSum Desired : ',num)
print('\nValues that add up to sum : ',subsetsum(array,num))