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

由于某些原因,OR运算符的行为与我期望的AND运算符的行为类似,反之亦然.

我的测试代码:

import pandas as pd

df = pd.DataFrame({'a': range(5), 'b': range(5) })

# let's insert some -1 values
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)]

print pd.concat([df, df1, df2], axis=1,
                keys = [ 'original df', 'using AND (&)', 'using OR (|)',])

结果是:

      original df      using AND (&)      using OR (|)    
             a  b              a   b             a   b
0            0  0              0   0             0   0
1           -1 -1            NaN NaN           NaN NaN
2            2  2              2   2             2   2
3           -1  3            NaN NaN            -1   3
4            4 -1            NaN NaN             4  -1

[5 rows x 6 columns]

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

我用的是Pandas 0.13.1.

推荐答案

如您所见,AND运算符删除至少有一个

这是正确的.记住,你写条件的依据是你想做什么,而不是你想放弃什么.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的习惯.

Python相关问答推荐

级联框架中的行、列索引

如何根据列的值在时间戳中均匀分布pandas rame行

Pandas提取电话号码(如果格式正确)

是否有使用纯霍夫曼编码的现代图像格式?

Python在通过Inbox调用时给出不同的响应

Django文件上传不起作用:文件未出现在媒体目录或数据库中

具有多个组的条形图的不同y标度

socket.gaierror:[Errno -2]名称或服务未知|Firebase x Raspberry Pi

是pandas.DataFrame使用方法查询后仍然排序吗?

在使用Guouti包的Python中运行MPP模型时内存不足

Python中使用时区感知日期时间对象进行时间算术的Incredit

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

未删除映射表的行

更改键盘按钮进入'

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

如何更改分组条形图中条形图的 colored颜色 ?

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

删除marplotlib条形图上的底边

不能使用Gekko方程'

将scipy. sparse矩阵直接保存为常规txt文件