Pandas: Фильтрация нескольких условий

Я пытаюсь сделать логическое индексирование с помощью нескольких условий, используя Pandas. Мой исходный DataFrame называется df. Если я выполню ниже, я получаю ожидаемый результат:

temp = df[df["bin"] == 3]
temp = temp[(~temp["Def"])]
temp = temp[temp["days since"] > 7]
temp.head()

Однако, если я это сделаю (что, я думаю, должно быть эквивалентным), я не возвращаю строки:

temp2 = df[df["bin"] == 3]
temp2 = temp2[~temp2["Def"] & temp2["days since"] > 7]
temp2.head()

Любая идея, что объясняет разницу?

Ответ 1

Используйте (), потому что приоритет оператора:

temp2 = df[~df["Def"] & (df["days since"] > 7) & (df["bin"] == 3)]

Либо создайте условия в отдельных строках:

cond1 = df["bin"] == 3    
cond2 = df["days since"] > 7
cond3 = ~df["Def"]

temp2 = df[cond1 & cond2 & cond3]

Образец:

df = pd.DataFrame({'Def':[True] *2 + [False]*4,
                   'days since':[7,8,9,14,2,13],
                   'bin':[1,3,5,3,3,3]})

print (df)
     Def  bin  days since
0   True    1           7
1   True    3           8
2  False    5           9
3  False    3          14
4  False    3           2
5  False    3          13


temp2 = df[~df["Def"] & (df["days since"] > 7) & (df["bin"] == 3)]
print (temp2)
     Def  bin  days since
3  False    3          14
5  False    3          13