I think need reshape boolean mask to (N x 1)
:
m = df.condition == 'yes'
df[['col1','col2']] = pd.DataFrame(np.where(m[:, None], ['sth',50.00], ['',0.0]))
Only disadvatage of solution is if different types of values in list
s - numeric with string
s - then numpy.where
both output columns convert to string
s.
Sample:
df = pd.DataFrame({'A':list('abcdef'),
'condition':['yes'] * 3 + ['no'] * 3})
print (df)
A condition
0 a yes
1 b yes
2 c yes
3 d no
4 e no
5 f no
m = df.condition == 'yes'
df[['col1','col2']] = pd.DataFrame(np.where(m[:, None], ['sth',50.00], ['',0.0]))
print (df)
A condition col1 col2
0 a yes sth 50.0
1 b yes sth 50.0
2 c yes sth 50.0
3 d no 0.0
4 e no 0.0
5 f no 0.0
print (df.applymap(type))
A condition col1 col2
0 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
1 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
2 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
3 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
4 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
5 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
EDIT: I test it with NaN
s values:
df = pd.DataFrame({'A':list('abcdefghi'),
'condition':['yes'] * 3 + ['no'] * 3 + [np.nan] * 3})
m = df.condition == 'yes'
df[['col1','col2']] = pd.DataFrame(np.where(m[:, None], ['sth',50.00], ['',0.0]))
print (df)
A condition col1 col2
0 a yes sth 50.0
1 b yes sth 50.0
2 c yes sth 50.0
3 d no 0.0
4 e no 0.0
5 f no 0.0
6 g NaN 0.0
7 h NaN 0.0
8 i NaN 0.0