Create Column with ELIF in Pandas
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')
Related videos on Youtube
DJElbow
Updated on July 27, 2022Comments
-
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 about 5 yearsthis really should be the accepted solution; it's scalable, and it doesn't even require an additional import:
pd.np.select
. -
GenDemo almost 3 yearsageed - I can't get any of these calling functions to work.
-
GenDemo almost 3 yearshow 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 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 useSeries.str.contains('tablet', case=False)
-
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'))