Вложенный np.where - PullRequest
       2

Вложенный np.where

0 голосов
/ 16 января 2019

У меня есть следующий фрейм данных:

S A
1 1
1 0
2 1
2 0

Я хотел создать новый столбец 'Result', который рассчитывается на основе значений столбца A и столбца S.

Iнаписал следующий вложенный np.where код

df['Result'] = np.where((df.S == 1 & df.A == 1), 1,
                        (df.S == 1 & df.A == 0), 0,
                        (df.S == 2 & df.A == 1), 0,
                        (df.S == 2 & df.A == 0), 1))))

, но когда я его выполняю, я получаю следующую ошибку:

SyntaxError: invalid syntax

Что не так с моим кодом?

1 Ответ

0 голосов
/ 16 января 2019

Насколько я знаю, np.where не поддерживает множественные операторы возврата (по крайней мере, не более двух).Так что либо вы переписываете np.where, чтобы получить одно утверждение True и одно False, и возвращаете 1/0 для True / False, либо вам нужно использовать маски.

Если вы переписываете np.where, выограничено двумя результатами, и второй результат всегда будет установлен, когда условие не True.Таким образом, он также будет установлен для значений, таких как (S == 5) & (A = np.nan).

df['Result'] = np.where(((df.S == 1) & (df.A == 1)) | ((df.S == 2) & (df.A == 0)), 1, 0)

При использовании масок вы можете применять произвольное количество условий и результатов.Для вашего примера решение выглядит следующим образом:

mask_0 = ((df.S == 1) & (df.A == 0)) | ((df.S == 2) & (df.A == 1))
mask_1 = ((df.S == 1) & (df.A == 1)) | ((df.S == 2) & (df.A == 0))
df.loc[mask_0, 'Result'] = 0
df.loc[mask_1, 'Result'] = 1

Результаты будут установлены на np.nan, если никакие условия не выполняются.Это imho отказоустойчиво и должно быть использовано.Но если вы хотите, чтобы в этих местах были нули, просто инициализируйте столбец Results нулями.
Конечно, это можно упростить для особых случаев, например, иметь только 1 и 0 в качестве результата, и расширить для любого числа результатов, используядикторы или другие контейнеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...