df.loc более 2-х условий - PullRequest
       1

df.loc более 2-х условий

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

У меня есть датафрейм для панд:

df = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [100, 200, 300, 400, 500, 
600]})

И я хочу создать новый столбец с некоторым значением, если соблюдены определенные условия. Проблема: это несколько условий с & и |. Я знаю, что могу сделать это только с двумя условиями, а затем с несколькими вызовами df.loc, но так как мой фактический набор данных довольно огромен с множеством различных значений, которые могут принимать переменные, я хотел бы знать, возможно ли это сделать в одном df.loc звонок. Я также пробовал np.where и раньше, но нашел df.loc в целом проще, поэтому было бы неплохо, если бы я мог придерживаться его.

Код, который я пробовал:

df.loc[(df.A == 1) | (df.A == 2) & (df.B == 600) | (df.B == 200), "C"] = 
"1or2and600or200"

что дает мне

print(df)  
   A    B                C
0  1  100  1or2and600or200
1  2  200  1or2and600or200
2  3  300              NaN
3  4  400              NaN
4  5  500              NaN
5  6  600              NaN

Это, однако, не то, что я хочу, поскольку df.loc, вероятно, учитывает только первые два условия. Итак, я бы хотел, чтобы в этом примере кода значение 1or2and600or200 было только в первой строке, а не во второй. Это возможно?

Большое спасибо.

1 Ответ

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

Все хорошо, за исключением того, что вам нужно позаботиться о лишних скобках.

df.loc[((df.A == 1) | (df.A == 2)) & ((df.B == 600) | (df.B == 200)), "C"] = "1or2and600or200"

Вы также можете перейти к .isin для получения более четкого и краткого изображения, как указано @ AndrewF

df.loc[df.A.isin([1, 2]) & df.B.isin([600, 200]), 'C'] = "1or2and600or200"

Кроме того, для вашего заданного состояния оно будет присутствовать во втором ряду, потому что именно там у вас есть 200 в B

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