2016-12-27 4 views
-1

Это код, который я использовал для вычисления подмножества с помощьюСумма Подмножество с помощью Панды Dataframe

код

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)) 

Выход для целочисленных значений

List of Values : [15 1 4 6 3 10 4] 

Sum Desired : 8 

Values that add up to sum : [1, 4, 3] 

Теперь, как могу ли я реализовать то же самое с использованием PANDAS Dataframe, а не с помощью массива Numpy?

+0

Я исправил отступы. Проверьте, правильно ли это. – MYGz

+2

«Перевести этот код для меня», как правило, не очень хороший способ задавать вопросы. Пожалуйста, объясните, что должен делать код на образце. – ayhan

+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))