np.where 多个变量

np.where on multiple variables

我有一个数据框:

customer_id [1,2,3,4,5,6,7,8,9,10]
feature1 [0,0,1,1,0,0,1,1,0,0]
feature2 [1,0,1,0,1,0,1,0,1,0]
feature3 [0,0,1,0,0,0,1,0,0,0]

使用这个我想创建一个新变量(比如 new_var)来说明当特征 1 为 1 时 new_var=1,如果 feature_2=1 则 new_var=2, feature3=1 then new_var=3 else 4. 我正在尝试 np.where 但虽然它没有给我一个错误,但它没有做正确的事情 - 所以我猜测嵌套 np.where 仅适用于单个变量。在这种情况下,在 pandas 中执行嵌套 if/case 的最佳方法是什么?

我的 np.where 代码是这样的:

df[new_var]=np.where(df['feature1']==1,'1', np.where(df['feature2']==1,'2', np.where(df[feature3']==1,'3','4')))

我认为你需要 numpy.select - 它 select 首先是 True 值,其他的都不重要:

m1 = df['feature1']==1 
m2 = df['feature2']==1    
m3 = df['feature3']==1 
df['new_var'] = np.select([m1, m2, m3], ['1', '2', '3'], default='4')

样本:

customer_id = [1,2,3,4,5,6,7,8,9,10]
feature1 = [0,0,1,1,0,0,1,1,0,0]
feature2 = [1,0,1,0,1,0,1,0,1,0]
feature3  = [0,0,1,0,0,0,1,0,0,0]

df = pd.DataFrame({'customer_id':customer_id,
                   'feature1':feature1,
                   'feature2':feature2,
                   'feature3':feature3})

m1 = df['feature1']==1 
m2 = df['feature2']==1    
m3 = df['feature3']==1 
df['new_var'] = np.select([m1, m2, m3], ['1', '2', '3'], default='4')
print (df)
   customer_id  feature1  feature2  feature3 new_var
0            1         0         1         0       2
1            2         0         0         0       4
2            3         1         1         1       1
3            4         1         0         0       1
4            5         0         1         0       2
5            6         0         0         0       4
6            7         1         1         1       1
7            8         1         0         0       1
8            9         0         1         0       2
9           10         0         0         0       4

如果在 features 中只有 10 是可能的,将 0 转换为 False 并将 1 转换为 True :

m1 = df['feature1'].astype(bool)
m2 = df['feature2'].astype(bool)
m3 = df['feature3'].astype(bool)
df['new_var'] = np.select([m1, m2, m3], ['1', '2', '3'], default='4')
print (df)
   customer_id  feature1  feature2  feature3 new_var
0            1         0         1         0       2
1            2         0         0         0       4
2            3         1         1         1       1
3            4         1         0         0       1
4            5         0         1         0       2
5            6         0         0         0       4
6            7         1         1         1       1
7            8         1         0         0       1
8            9         0         1         0       2
9           10         0         0         0       4

Try:

df['new_var']=np.where(df['feature3']==1, '3', '4')
df['new_var']=np.where(df['feature2']==1,'2', df['new_var'])
df['new_var']=np.where(df['feature1']==1, '1', df['new_var'])