Ложная опция, возвращающаяся в np select?

#python #pandas

Вопрос:

Я сделал этот выбор np, но операторы и не работают!

 df = pd.DataFrame({'A': [2107], 'B': [76380700]}) cond = [(df["A"]==2107)|(df["A"]==6316)amp;(df['B']gt;=10000000)amp;(df['B']lt;=19969999),  (df["A"]==2107)|(df["A"]==6316)amp;(df['B']gt;=1000000)amp;(df['B']lt;=99999999)] choices =["Return 1", "Return 2"] df["C"] = np.select(cond, choices, default = df["A"])  

NP выберите возврат «Возврат 1», но правильным вариантом является «Возврат 2».

 gt;gt;df["C"] 0 Return 1  

Причина, по которой эта строка возвращает false

 gt;gt;df["B"]lt;=19969999 False  

Как я могу решить эту проблему?

Комментарии:

1. Я не совсем понимаю, что ты пытаешься сделать. Приоритет оператора обрабатывается amp; до | того, как это означает, что все ИД в cond1 сначала оцениваются как Ложные, которые затем сравниваются с (df["A"]==2107) истинными. Возможно, вам не хватает некоторых скобок?

2. @HenryEcker Спасибо тебе!! Я просто меняю последовательность на df['B']gt;=10000000)amp;(df['B']lt;=19969999)amp;(df["A"]==2107)|(df["A"]==6316) и работаю

Ответ №1:

Это проблема предшествования оператора. Вот что ты написал:

 cond = [  (df["A"]==2107) |  (df["A"]==6316) amp;  (df['B']gt;=10000000) amp;  (df['B']lt;=19969999),   (df["A"]==2107) |  (df["A"]==6316) amp;  (df['B']gt;=1000000) amp;  (df['B']lt;=99999999) ]  

Вот как это интерпретируется:

 cond = [  (df["A"]==2107) |  (  (df["A"]==6316) amp;  (df['B']gt;=10000000) amp;  (df['B']lt;=19969999)  ),   (df["A"]==2107) |  (  (df["A"]==6316) amp;  (df['B']gt;=1000000) amp;  (df['B']lt;=99999999)  ) ]  

Вам нужны родители вокруг предложения «или» :

 cond = [  ( (df["A"]==2107) | (df["A"]==6316) ) amp;  (df['B']gt;=10000000) amp;  (df['B']lt;=19969999),   ( (df["A"]==2107) | (df["A"]==6316) ) amp;  (df['B']gt;=1000000) amp;  (df['B']lt;=99999999)  ) ]  

И, кстати, нет абсолютно ничего плохого в том, чтобы писать выражения так, как я это сделал там. Разве не намного яснее, что происходит, когда все так разнесено?

Комментарии:

1. спасибо за ваше объяснение! Таким образом, это действительно становится намного понятнее, я собираюсь начать использовать этот отступ в своих сценариях! @Тим Робертс

Ответ №2:

Я думаю, что вы пропустили скобки для (df["A"]==2107)|(df["A"]==6316) . В вашем сценарии проверялось условие возврата 1 (df["A"]==2107)|(df["A"]==6316))amp;(df['B']gt;=10000000)amp;(df['B']lt;=19969999) , что означает A==2107 ИЛИ (A == 6316 amp; B… amp; B… ). Вот почему np.select возвращает «Возвращает 1», потому что это правда.

 df = pd.DataFrame({'A': [2107], 'B': [76380700]}) cond = [((df["A"]==2107)|(df["A"]==6316))amp;(df['B']gt;=10000000)amp;(df['B']lt;=19969999),  (df["A"]==2107)|(df["A"]==6316)amp;(df['B']gt;=1000000)amp;(df['B']lt;=99999999)] choices =["Return 1", "Return 2"] df["C"] = np.select(cond, choices, default = df["A"])