Насколько я знаю, 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 в качестве результата, и расширить для любого числа результатов, используядикторы или другие контейнеры.