Create Column with ELIF in Pandas

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.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 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)

Method 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'

Method 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

Method 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')

Method 5

Adding to apply lambda solution :

 df['combo'] = df.apply(lambda x: 'mobile' if x['mobile'] == 'mobile' else 
                                 ('tablet' if x[''mobile']== 'tablet' else 'other'), axis=1)

Structure :

df['column_name'] = df.apply(lambda x: 'value if true 1' if x['column_name_check_1'] == 'condition_1' else 
                                      ('value if true 2' if x['column_name_check_2'] == 'condition_2' else 
                                      ('value if true 3' if x['column_name_check_3'] == 'condition_3' else 'default_value')),axis=1)

Note :
axis 1 for format value as column / series


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x