熊猫:索引数据帧时出现多个条件-意外行为

我通过两列中的值过滤数据帧中的行

出于某种原因,OR运算符的行为与我期望的和运算符的行为相同,反之亦然

我的测试代码:

将熊猫作为pd导入
df=pd.DataFrame({'a':范围(5),'b':范围(5)})
#让我们插入一些-1值
df['a'][1]=-1
df['b'][1]=-1
df['a'][3]=-1
df['b'][4]=-1
df1=df[(df.a!=-1)和(df.b!=-1)]
df2=df[(df.a!=-1)|(df.b!=-1)]
打印pd.concat([df,df1,df2],轴=1,
键=[“原始df”、“使用AND(&)”、“使用OR(|)”、])

结果是:

原始df使用和(&)使用或(|)
a b a b a b
0            0  0              0   0             0   0
1-1-1楠楠楠
2            2  2              2   2             2   2
3-13楠楠-13
4 4-1楠楠4-1
[5行x 6列]

如您所见,运算符会删除至少一个值等于-1的每一行。另一方面,运算符要求两个值都等于-1,才能删除它们。我预期的结果恰恰相反。有人能解释一下这种行为吗

我使用的是熊猫0.13.1

如您所见,AND运算符删除至少有一个
值等于-1。另一方面,OR运算符同时需要这两个参数
值等于-1以删除它们

对。请记住,您是根据希望保留的内容编写条件的,而不是根据希望删除的内容编写条件的。对于df1

df1=df[(df.a!=-1)&(df.b!=-1)]

您的意思是“保留df.a不是-1且df.b不是-1的行”,这与删除至少一个值为-1的每一行相同

对于df2

df2=df[(df.a!=-1)|(df.b!=-1)]

您的意思是“保留df.adf.b不是-1的行”,这与删除两个值都是-1的行相同

注:像df['a'][1]=-1这样的链式访问会让你陷入麻烦。最好养成使用.loc.iloc的习惯

发表评论