#python #pandas
#питон #панды
Вопрос:
Попытка воспроизвести простую функцию Excel в панд, без успеха. Еще не пробовал np.where (), так как я хочу изучить лямбда-функции и по возможности меньше полагаться на импорт.
Функция для репликации:
= IF([@[Coupa Type]]="freeform","Freeform","Structured PO")
Лямбда я протестировал и работает:
lambdatest = lambda x: f"{x} is even" if x % 2 == 0 else f"{x} is odd"
Лямбда для панд, которая не работает:
test = raw[["Coupa Type", "Structured Pos"]] test["Structured Pos"] = test.apply( lambda x: "Freeform" if test["Coupa Type"] == "freeform" else "Structured PO" )
Ошибка:
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Я предполагаю, что он пытается оценить весь столбец, а не строку за строкой, как мне это исправить?
Комментарии:
1. Во-первых, вы уверены, что находитесь на правильной оси при применении, по умолчанию она идет вертикально, а не горизонтально, вам нужно поставить ось = 1 для применения по строке. Второе, что я замечаю, в вашей второй лямбда-функции вы используете test, а не x, может быть, в этом ваша проблема ?
Ответ №1:
Я это вам нужно добавить axis=1
в свой apply()
вызов, чтобы лямбда-функция выполнялась для каждой строки, а не для каждого столбца, как по умолчанию:
test["Structured Pos"] = test.apply( lambda x: "Freeform" if x["Coupa Type"] == "freeform" else "Structured PO", axis=1, )
(Вам также нужно использовать x["Coupa Type"]
вместо test["Coupa Type"]
функции Лямбда, как я сделал выше.)
Более эффективным решением для этого случая, однако, было бы сделать что-то, связывающее это:
test["Structured Pos"] = test["Coupa Type"].map({"freeform": "Freeform"}).fillna("Structured PO")
…поскольку map
заменяет все значения в серии, которые являются ключами в словаре, значениями словаря, а значения в серии, которые не входят в ключи в словаре, он заменяет на NaN, поэтому вы можете использовать fillna
для указания значения по умолчанию.