#python #pandas #numpy #dataframe #where
#python #pandas #numpy #фрейм данных #where-предложение
Вопрос:
Я пытаюсь создать новый столбец во фрейме данных, который помечает одомашненных животных символом 1. Я использую цикл for, но по какой-то причине цикл выбирает только последний элемент в pets
списке. dog
, cat
и gerbil
всем должно быть присвоено значение 1 под domesticated
столбцом. У кого-нибудь есть исправление для этого или лучший подход?
df = pd.DataFrame(
{'creature': ['dog', 'cat', 'gerbil', 'mouse', 'donkey']
})
pets = ['dog', 'cat', 'gerbil']
for pet in pets:
df['domesticated'] = np.where(df['creature']==pet, 1, 0)
df
Ответ №1:
Вы устанавливаете все значения, отличные от gerbil, в 0
на вашей последней итерации цикла. То есть, когда pet
это gerbil
ваша последняя итерация, ВСЕ записи, которые не равны gerbil
, будут соответствовать 0
. Сюда входят записи, которые являются dog
или cat
. Вы должны проверить все значения в pets
сразу. Попробуйте это:
df['domesticated'] = df['creature'].apply(lambda x: 1 if x in pets else 0)
Если вы хотите придерживаться np.where
:
df['domesticated'] = np.where(df['creature'].isin(pets), 1, 0)
Комментарии:
1. это здорово. Я отмечу это, когда мне будет разрешено. Вы знаете, почему цикл for в этом случае не работает? Я включаю
dog
,cat
иgerbil
вpets
список, поэтому я подумал, что повторение этого списка будет работать нормально.2. Я обновил свой пост с более подробной информацией. Идея заключается в том, что последняя итерация перезаписывает все, что было до этого, поэтому вы, по сути, просто проверяете значения, равные
gerbil
.
Ответ №2:
Проблема в том, что каждый цикл сбрасывает ваши результаты.
df['domesticated'] = df.isin(pets).astype(int)
creature domesticated
0 dog 1
1 cat 1
2 gerbil 1
3 mouse 0
4 donkey 0