Create Column with ELIF in Pandas

65,177

Solution 1

In cases where you have multiple branching statements it's best to create a function that accepts a row and then apply it along the axis=1. This is usually much faster then iteration through rows.

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)

Solution 2

I tried the following and the result was much faster. Hope it's helpful for others.

df['combo'] = 'other'
df.loc[df['mobile'] == 'mobile', 'combo'] = 'mobile'
df.loc[df['tablet'] == 'tablet', 'combo'] = 'tablet'

Solution 3

ELIF logic can be implemented with np.select or nested 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'))

Sample Data + Output:

   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

Solution 4

Adding to np.where solution :

df['col1']= np.where(df['col'] < 3, 1,np.where( (df['col'] >3 )& (df['col'] <5),2,3))

Overall Logic is :

np.where(Condition, 'true block','false block'). 

With each true/false block can in turn again be nested.

Also, Notice the & for ANDing! (not 'and')

Share:
65,177

Related videos on Youtube

DJElbow
Author by

DJElbow

Updated on July 27, 2022

Comments

  • DJElbow
    DJElbow almost 2 years

    Question

    I am having trouble figuring out how to create new DataFrame column based on the values in two other columns. I need to use if/elif/else logic. But all of the documentation and examples I have found only show if/else logic. Here is a sample of what I am trying to do:

    Code

    df['combo'] = 'mobile' if (df['mobile'] == 'mobile') elif (df['tablet'] =='tablet') 'tablet' else 'other')
    

    I am open to using where() also. Just having trouble finding the right syntax.

  • circld
    circld about 5 years
    this really should be the accepted solution; it's scalable, and it doesn't even require an additional import: pd.np.select.
  • GenDemo
    GenDemo almost 3 years
    ageed - I can't get any of these calling functions to work.
  • GenDemo
    GenDemo almost 3 years
    how would you do an 'in' statement: example df['combo'] = np.where(df.device in ('moblile, 'Mobile', 'Phone'), 'mobile' , np.where(df.device like '%tablet%', 'tablet', 'other'))
  • ALollz
    ALollz almost 3 years
    @GenDemo you can use isin for checking if something is in a list: stackoverflow.com/questions/19960077/…. IIU the other logic, for the like you can use Series.str.contains('tablet', case=False)
  • GenDemo
    GenDemo almost 3 years
    @ALollz thank you. I came right with sale_method = pd.DataFrame(model_data['Sale Method'].str.upper()) sale_method['sale_classification'] = np.where(sale_method['Sale Method'].isin (['PRIVATE']), 'private' ,np.where(sale_method['Sale Method'].str.contains('AUCTION'), 'auction' , 'other'))

Related