Для цикла с использованием np.where - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь создать новый столбец в кадре данных, который помечает животных, которые одомашнены, с помощью 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

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Проблема в том, что каждый цикл сбрасывает ваши результаты.

df['domesticated'] = df.isin(pets).astype(int)

  creature  domesticated
0      dog             1
1      cat             1
2   gerbil             1
3    mouse             0
4   donkey             0
1 голос
/ 21 марта 2019

Вы устанавливаете все не песчанки на 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)
...