Панда новый столбец из (возможно) рекурсивной функции - PullRequest
0 голосов
/ 04 июля 2018

У меня есть некоторые данные, подобные этому:

labels = ["sku", "buildfrom", "factor", "quantity"]
records = [("pipe5", "pipe10", 2, 1),
("pipe10", "pipe20", 2, 4),
("pipe20", "pipe20", 1, 3)]

df = pd.DataFrame.from_records(records, columns=labels)

В этих данных pipe5 - продукт с доступным количеством 1, однако pipe5 может быть изготовлен из pipe10 , как buildfrom столбец показывает. А значение 2 в столбце factor означает, что элемент buildfrom может составлять 2 единицы элемента sku . Я хотел бы создать столбец с именем «can_make_qty» и заполнить его возможным общим количеством sku, которое мы можем сделать доступным. В этом случае значения can_make_qty будут:

  • 3 для pipe20 (поскольку значения buildfrom == sku, а factor равен 1)
  • 10 для трубы10 (4 из собственного запаса + (2 * 3) из трубы20)
  • 21 для трубы 5 (1 из собственного запаса + (2 * 10) из трубы 10)

Я вижу некоторое использование рекурсивной логики здесь, но я не знаю, как закодировать ее в функцию, чтобы добавить результаты в "can_make_qty".

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 12 июля 2018

Ну, я дошел до решения с рекурсией, и оно работает в случае выше:

def canmake(row):
    final=[]
    final.append(row['quantity'])
    item = row['buildfrom']
    factor = row['factor']

    def recsearch(item, factor):
    # Since the buildfrom is different from item
    # I need to find the quantity of the item the can build the row['sku'] item
    # And multiply it by the factor from the row being analyzed
    # I have to search it in the *whole* DataFrame list
        qty = df[df['sku'] == item]['quantity'].values[0]

        final.append(qty*factor)
    # collect the new factor
        newfactor = df[df['sku'] == item]['factor'].values[0]
        factor *= newfactor
    # if the one searched has the same name for its sku and buildfrom then we don't
    # need to go any further, else do this:
        if (df[df['sku'] == item]['buildfrom'].values[0]) != (df[df['sku'] == item]['sku'].values[0]):

            item = df[df['sku'] == item]['buildfrom'].values[0]
            recsearch(item, factor)


    if row['buildfrom'] != row['sku']:
        recsearch(item, factor)

    return final # reduce(operator.add, final)

df['can_make_qty']=df.apply(canmake, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...