Создать столбец с ELIF в Pandas
Вопрос
Мне трудно понять, как создать новый столбец DataFrame на основе значений в двух других столбцах. Мне нужно использовать if/elif/else логику. Но вся документация и примеры, которые я нашел, показывают только логику if/else. Вот пример того, что я пытаюсь сделать:
код
df['combo'] = 'mobile' if (df['mobile'] == 'mobile') elif (df['tablet'] =='tablet') 'tablet' else 'other')
Я открыт для использования where(). Просто возникли проблемы с поиском правильного синтаксиса.
Ответы
Ответ 1
В случаях, когда у вас есть несколько операторов ветвления, лучше всего создать функцию, которая принимает строку, а затем применить ее вдоль axis=1
. Это обычно намного быстрее, чем итерация через строки.
def func(row):
if row['mobile'] == 'mobile':
return 'mobile'
elif row['tablet'] =='tablet':
return 'tablet'
else:
return 'other'
df['combo'] = df.apply(func, axis=1)
Ответ 2
Я попробовал следующее, и результат был намного быстрее. Надеюсь, это полезно для других.
df['combo'] = 'other'
df.loc[df['mobile'] == 'mobile', 'combo'] = 'mobile'
df.loc[df['tablet'] == 'tablet', 'combo'] = 'tablet'
Ответ 3
Логика ELIF
может быть реализована с помощью np.select
или np.where
:
import numpy as np
df['combo'] = np.select([df.mobile == 'mobile', df.tablet == 'tablet'],
['mobile', 'tablet'],
default='other')
# or
df['combo'] = np.where(df.mobile == 'mobile', 'mobile',
np.where(df.tablet == 'tablet', 'tablet', 'other'))
Пример данных + вывод:
mobile tablet combo
0 mobile bar mobile
1 foo tablet tablet
2 foo nan other
3 mobile tablet mobile
4 mobile nan mobile
5 foo tablet tablet
6 mobile bar mobile
7 mobile tablet mobile
8 mobile bar mobile
9 mobile nan mobile
Ответ 4
Добавление решения np.where:
df['col1']= np.where(df['col'] < 3, 1,np.where( (df['col'] >3 )& (df['col'] <5),2,3))
Общая логика это:
np.where(Condition, 'true block','false block').
С каждым блоком истина/ложь можно в свою очередь снова вкладываться.
Кроме того, обратите внимание на &
для ANDing! (not 'and')
ANDing! (not 'and')