Я работаю с DataFrame, который выглядит так:
Я хотел создать новый столбец «Именованный», чтобы использовать категориальный столбец «Имя» в линейной регрессии. Для достижения этой цели я сделал следующее:
def named(name):
if name == 'UNNAMED':
return 0
else:
return 1
df['Named'] = df['Name'].apply(lambda name: named(name))
Однако это дает столбец, состоящий только из значения 1
Функция работает сама по себе, но по какой-то причине не работает при использовании в методе DataFrame.apply.
2 ответа
Следующее должно работать:
df['Named']=[i for i in map(lambda x: 0 if x.strip()=='UNNAMED' else 1, df['Name'])]
- Вы можете элегантно решить эту проблему с помощью
df.assign(Named = lambda df: (df["Name"]!='UNNAMED').astype(int))
- Ваша функция не векторизуется, но 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().
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.