#python #pandas
#python #pandas
Вопрос:
У меня есть следующий фрейм данных:
dummy number other
1 0 3 3
2 0 8 3
3 1 6 2
4 0 5 1
5 1 9 6
6 0 2 5
Это очень большой фрейм данных, поэтому мы надеемся найти наиболее эффективный способ :
Создайте новый столбец, вызываемый output
на основе следующего:
Если dummy
равно 1
, я хотел бы установить значение как -1
Если dummy
не равно 1
, я хотел бы установить значение как other
* number
Ожидаемый результат:
dummy number other output
1 0 3 3 9
2 0 8 3 24
3 1 6 2 -1
4 0 5 1 5
5 1 9 6 -1
6 0 2 5 10
Учитывая, что у меня так много строк, какой наиболее эффективный способ сделать это?
Я пробовал:
df['output'] = df['dummy'].apply(lambda x: -1 if x == 1 else df['other'] * df['number'])
выдает мне TypeError: object of type 'int' has no len()
ошибку.
Любая помощь будет высоко оценена! Спасибо
Ответ №1:
Используйте numpy.where
здесь, это быстрее apply
, потому что под капотом есть циклы:
df['output'] = np.where(df['dummy'] == 1, -1, df['other'] * df['number'])
Или:
df['output'] = (df['other'] * df['number']).mask(df['dummy'] == 1, -1)
#changed mask
df['output'] = (df['other'] * df['number']).where(df['dummy'] != 1, -1)
print (df)
dummy number other output
1 0 3 3 9
2 0 8 3 24
3 1 6 2 -1
4 0 5 1 5
5 1 9 6 -1
6 0 2 5 10
Комментарии:
1. Было бы лучше, если бы вы также могли добавить альтернативное
df.where
командное решение.
Ответ №2:
Я думаю, вам нужно это сделать:
df['output'] = df.apply(lambda x: -1 if x['dummy'] == 1 else x['other'] * x['number'])
Комментарии:
1. большое спасибо! в итоге я выбрал
np.where
утверждение