Как обрабатывать несколько условий в np.where ()? не использовать .apply, так как он слишком медленный - PullRequest
0 голосов
/ 09 октября 2019

Обновлено: имея набор данных вопросов для опроса, мне нужно классифицировать разные ответы на разные категории:

Index,Q1,Q2,Q3,Q4,Q5,Q6,Q7
1,TRUE,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE
2,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE
3,FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE
4,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE
5,TRUE,FALSE,TRUE,FALSE,TRUE,TRUE,FALSE
6,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,TRUE
7,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,FALSE
8,TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE
9,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE
10,FALSE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE
11,TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,TRUE

Правила генерации вывода категории (если не указано, допустимо ИСТИНА или ЛОЖЬ):

                                                      Output
Rule 1  Q1 = TRUE   Q2 = TRUE   Q5 = TRUE             High
Rule 2  Q1 = TRUE   Q2 = TRUE   Q4 = TRUE   Q7=TRUE   High
Rule 3  Q2 = TRUE   Q3 = TRUE   Q6 = TRUE             Mid
Rule 4  Q2 = TRUE   Q3 = TRUE   Q7 = TRUE             Mid
Rule 5  Q4 = TRUE   Q7 = TRUE   Q1 = FALSE  Q2= FALSE Mid-LOW
Rule 6  all = FALSE                                   LOW

Я пробовал следующий код:

c1=df['Q1'].eq('TRUE')
c2=df['Q2'].eq('TRUE')
c3=df['Q5'].eq('TRUE')
c4=df['Q4'].eq('TRUE')
c5=df['Q5'].eq('TRUE')
c6=df['Q6'].eq('TRUE')
c7=df['Q7'].eq('TRUE')
df['Restock Action']=np.where((c1&c2&c5) | (c1&c2&c4&c7),'high','')

Вопрос: Как мне справиться с такой ситуацией, когда: 1. несколько правил имеют один и тот же результат 2. существует более одного результата(т.е. высокий, средний, средний низкий, низкий)

Спасибо!

1 Ответ

3 голосов
/ 09 октября 2019

Поскольку у вас есть более двух условий, вы должны использовать np.select, где вы указываете несколько условий и на основе этих вариантов выбора.

Мы используем оператор NOT (~), чтобы поймать False для c1 и c2, поскольку они являются обратными.

conditions = [
    (c1&c2&c5) | (c1&c2&c4&c7),
    (c2&c3&c6) | (c2&c3&c7),
    c4%c7&~c1&~c2
]

choices = ['High', 'Mid', 'Mid-Low']

df['Restock Action'] = np.select(conditions, choices, default='Low')

output

       Q1     Q2     Q3     Q4     Q5     Q6     Q7 Restock Action
0    True  False   True   True  False   True  False            Low
1    True  False  False   True  False  False   True            Low
2   False  False  False   True   True  False   True            Low
3   False  False  False  False  False  False  False            Low
4    True  False   True  False   True   True  False            Low
5   False  False  False  False   True  False   True            Low
6   False  False   True   True   True   True  False            Low
7    True   True  False  False   True  False  False           High
8   False  False  False  False  False  False  False            Low
9   False   True   True  False  False   True   True            Low
10   True   True  False   True  False  False   True           High
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...