Создать столбец с 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')