Для цикла с использованием np.где

#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