np.where для нескольких переменных

У меня есть кадр данных с:

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. где, но хотя это не дает мне ошибки, это не делает правильно, поэтому я думаю, что вложенный np.where работает только с одной переменной. В таком случае, как лучше всего выполнить вложенный if/case в pandas?

Мой код np.where был примерно таким:

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

person Shraddha    schedule 10.08.2017    source источник
comment
Просто чтобы ответить на мой собственный вопрос: решение np.where, которое я упомянул как то, что я пробовал, также работает - причина, по которой оно не давало мне правильных результатов, заключалась в том, что тип данных для feature1 был строковым, а не целым числом.. поэтому для любой, кто ищет похожие вопросы, как решение «вложенное np.where», так и решение «numpy.select», упомянутое jezrael работает   -  person Shraddha    schedule 10.08.2017


Ответы (2)


Я думаю, вам нужно 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 возможно только 1 и 0 преобразовать 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
person jezrael    schedule 10.08.2017
comment
Спасибо @jezrael - кажется, работает хорошо, если я попробую этот пример, но не свой код, и я пытаюсь понять, почему. Кроме того, это решение не будет работать в случаях, когда все функции 1, 2, 3 равны 1, когда они принимают только первое значение (например, строка 3). - person Shraddha; 10.08.2017
comment
Работает сейчас! У меня были 0/1 в виде строк, поэтому каждый раз возвращалось значение 4 по умолчанию. Спасибо! - person Shraddha; 10.08.2017

Пытаться:

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'])
person Muhammad Rasel    schedule 22.07.2021