我通过两列中的值过滤数据帧中的行
出于某种原因,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.a或df.b不是-1的行”,这与删除两个值都是-1的行相同
注:像df['a'][1]=-1这样的链式访问会让你陷入麻烦。最好养成使用.loc和.iloc的习惯