Использование словаря имен столбцов, чтобы решить, как умножить через уравнение в Python - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь определить функцию, которая перебирает словарь, в котором ключами являются имена столбцов данных, а значения - это скидки, связанные с этим столбцом, если наблюдение соответствует критериям для скидки.Я хочу умножить скидки вместе и использовать продукт в качестве компенсации в GLM.В настоящее время я получаю следующую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-242-0029e2a0de4f> in <module>
----> 1 offset_params(df)

<ipython-input-241-b5343cde7a7e> in offset_params(df)
      8 
      9     for keys, vals in discounts.items():
---> 10         if df[keys] == 0:
     11             offset = offset * 1
     12         else:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1574         raise ValueError("The truth value of a {0} is ambiguous. "
   1575                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1576                          .format(self.__class__.__name__))
   1577 
   1578     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Вот пример кода, который выдает такую ​​же ошибку:

import pandas as pd

discounts = {'discount1_0':[0,1], 'discount1_1':[1,0], 'discount2_0':[0,1],'discount2_1':[1,0]
                         , 'discount3_0':[0,1],'discount3_1':[1,0],'discount1_0':[1,0], 'discount1_1':[0,1]
                         , 'discount2_0':[1,0],'discount2_1':[0,1], 'discount3_0':[1,0],'discount3_1':[0,1]        
            }
df = pd.DataFrame(discounts)

def offset_params(df):
    discounts = {'discount1_0':1, 'discount1_1':.98, 'discount2_0':1,'discount2_1':.95
                         , 'discount3_0':1,'discount3_1':.95,'discount1_0':1, 'discount1_1':.98
                         , 'discount2_0':1,'discount2_1':.95, 'discount3_0':1,'discount3_1':.95
            }

    offset = 1

    for keys, vals in discounts.items():
        if df[keys] == 0:
            offset = offset * 1
        else:
            offset = offset * vals

    return offset

Где я иду не так?

1 Ответ

0 голосов
/ 09 мая 2019

Вам нужно работать с вашим кадром данных построчно. Функция в пандах для этого - apply. Вместо передачи всего фрейма данных в offset_params передайте его строка за строкой, используя apply для итерации по всему фрейму данных.

df['offset'] = df.apply(lambda row: offset_params(row), axis=1)

# Then look at your dataframe:

df.head()

Я бы изменил имя переменной df в вашей функции на row, чтобы код имел больше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...