Вы перепутали несколько понятий. Когда вы используете pandas.DataFrame.apply
(с axis=1
), вы выполняете итерацию по каждой строке и передаете эту строку (как объект pandas.Series
) функции, которую вы использовали, когда вызывали apply
.
Первая точка отказа
Вместо этого вы вызываете свою функцию внутри apply
и передаете в нее два столбца. Это передаст возвращаемое значение функции в apply
. Поскольку ваша функция не передает обратно вызываемый объект, это должно завершиться ошибкой.
Вторая точка отказа
Кроме того, ваша функция предназначена для просмотра скалярных значений, следовательно, if y == 0:
, и когда вы передаете столбец, такой как ordini["revenue1"]
(который является pandas.Series
объектом), он пытается оценить if pandas.Series == 0:
, и именно это генерирует ошибка, которую вы видите:
ValueError: The truth value of a Series is ambiguous.
Подход № 1
Исправьте свою функцию и не используйте apply
def delta_perc(x, y):
return x.sub(y).div(x).mask(x == 0, 0).mul(100)
ordini["discount"] = delta_perc(ordini["revenue1"], ordini["revenue2"])
Подход № 2
Исправьте свою функцию и используйте map
. Это было бы похоже на использование понимания.
def delta_perc(x, y):
if x == 0:
return 0
else:
return (x - y) / x * 100
ordini["discount"] = [*map(delta_perc, ordini["revenue1"], ordini["revenue2"])]
Подход № 3
На самом деле, используя apply
def delta_perc(x, y):
if x == 0:
return 0
else:
return (x - y) / x * 100
# Because remember `apply` takes a function that gets a row (or column) passed to it
ordini["discount"] = ordini.apply(
lambda row: delta_perc(row['revenue1'], row['revenue2']),
axis=1
)