熊猫:过滤多种条件

bcl*_*man 17 python pandas

我正在尝试使用Pandas对几个条件进行布尔索引.我的原始DataFrame被调用df.如果我执行以下操作,我会得到预期的结果:

temp = df[df["bin"] == 3]
temp = temp[(~temp["Def"])]
temp = temp[temp["days since"] > 7]
temp.head()
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做(我认为应该是等效的),我没有返回任何行:

temp2 = df[df["bin"] == 3]
temp2 = temp2[~temp2["Def"] & temp2["days since"] > 7]
temp2.head()
Run Code Online (Sandbox Code Playgroud)

知道是什么导致了差异吗?

jez*_*ael 23

使用()因为运算符优先级:

temp2 = df[~df["Def"] & (df["days since"] > 7) & (df["bin"] == 3)]
Run Code Online (Sandbox Code Playgroud)

或者,在单独的行上创建条件:

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

temp2 = df[cond1 & cond2 & cond3]
Run Code Online (Sandbox Code Playgroud)

样品:

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
Run Code Online (Sandbox Code Playgroud)


小智 11

或者

 df_train[(df_train["fold"]==1) | (df_train["fold"]==2)]
Run Code Online (Sandbox Code Playgroud)

 df_train[(df_train["fold"]==1) & (df_train["fold"]==2)]
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以提供问题的解决方案,但最好添加有关其工作原理/原因的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。当代码被解释时,您也可能会以点赞的形式得到用户的积极反馈。 (2认同)