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