Панды изменяют значение столбца на основе другого столбца с помощью функции лямбда

#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 для указания значения по умолчанию.