我认为需要将布尔掩码重塑为(N x 1):
m = df.condition == 'yes'
df[['col1','col2']] = pd.DataFrame(np.where(m[:, None], ['sth',50.00], ['',0.0]))
解决方案的唯一缺点是如果 lists 中的不同类型的值 - 带有 strings 的数字 - 然后 numpy.where 两个输出列都转换为 strings。
示例:
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'>
编辑:我用NaNs 值测试它:
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