Я работаю с DataFrame, который выглядит так:

DataFrame

Я хотел создать новый столбец «Именованный», чтобы использовать категориальный столбец «Имя» в линейной регрессии. Для достижения этой цели я сделал следующее:

def named(name):
if name == 'UNNAMED':
    return 0
else:
    return 1


df['Named'] = df['Name'].apply(lambda name: named(name))

Однако это дает столбец, состоящий только из значения 1

Функция работает сама по себе, но по какой-то причине не работает при использовании в методе DataFrame.apply.

0
Aayush Panda 8 Сен 2020 в 22:52

2 ответа

Лучший ответ

Следующее должно работать:

df['Named']=[i for i in map(lambda x: 0 if x.strip()=='UNNAMED' else 1, df['Name'])]
1
IoaTzimas 8 Сен 2020 в 20:03
  1. Вы можете элегантно решить эту проблему с помощью
df.assign(Named = lambda df: (df["Name"]!='UNNAMED').astype(int))
  1. Ваша функция не векторизуется, но apply передает весь столбец, то есть объект серии, в named. Этот объект явно не равен UNNAMED, следовательно, вы получаете 1. Вы пробовали applymap? Это работает для меня, как вы хотите

Более того, в последней версии pandas я не могу воспроизвести ваш пример, я вижу это сообщение об ошибке:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
1
Quickbeam2k1 8 Сен 2020 в 20:36