Как правильно использовать apply и lambda в вычислении ячеек pandas

#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 утверждение