【问题标题】:np.where on multiple variablesnp.where 在多个变量上
【发布时间】:2017-08-10 09:37:16
【问题描述】:

我有一个数据框:

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 则 new_var=3 否则为 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')))

【问题讨论】:

  • 只是为了回答我自己的问题:我提到的我尝试过的 np.where 解决方案也有效 - 它没有给我正确结果的原因是因为 feature1 的数据类型是字符串而不是整数.. 所以对于任何寻找类似问题的人来说,'nested np.where' 解决方案和 'numpy.select' 解决方案 jezrael 提到的作品

标签: python pandas if-statement case-when np


【解决方案1】:

我认为您需要 numpy.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 转换为False1True

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

【讨论】:

  • 谢谢@jezrael - 如果我尝试这个例子而不是我的代码,似乎效果很好,我试图找出原因。此外,对于仅采用第一个值(例如第 3 行)的特征 1、2、3 全部为 1 的情况,此解决方案将不起作用。
  • 现在工作!我将 0/1 作为字符串,这就是为什么它每次都返回默认值 4。谢谢!
【解决方案2】:

试试:

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

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2020-04-02
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多