#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"])