python - "== True"和 "is True"的表达式给出不同的结果

标签 python pandas pep8

我有以下 MCVE :

#!/usr/bin/env python3                                           

import pandas as pd

df = pd.DataFrame([True, False, True])

print("Whole DataFrame:")
print(df)

print("\nFiltered DataFrame:")
print(df[df[0] == True])

输出如下,符合我的预期:

Whole DataFrame:
     0
  0  True
  1  False
  2  True

Filtered DataFrame:
     0
  0  True
  2  True

好的,但是 PEP8样式似乎是错误的,它说:E712 与 True 的比较应该是 if cond is Trueif cond。所以我将其更改为 is True 而不是 == True 但现在它失败了,输出是:

Whole DataFrame:
    0
0   True
1  False
2   True

Filtered DataFrame:
0     True
1    False
2     True
Name: 0, dtype: bool

这是怎么回事?

最佳答案

这里要注意的是,在 df[df[0] == True] 中,您没有将对象与 True 进行比较。

正如其他答案所说,==pandas 中重载以生成 Series 而不是 bool 和往常一样。 [] 也被重载以解释 Series 并给出过滤后的结果。该代码本质上等同于:

series = df[0].__eq__(True)
df.__getitem__(series)

因此,将 == 留在这里,您没有违反 PEP8。


本质上,pandas 提供了熟悉的语法和不寻常的语义 - 这就是造成混淆的原因。

According to Stroustroup (sec.3.3.3),运算符重载自发明以来就一直因此而引起麻烦(他不得不认真考虑是否将其包含到 C++ 中)。 Seeing even more abuse of it in C++ , Gosling 在 Java 中跑到另一个极端,完全禁止它,事实证明,这恰恰是一个极端。

因此,现代语言和代码往往会出现运算符重载,但请密切注意不要过度使用它,并确保语义保持一致。

关于python - "== True"和 "is True"的表达式给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36825925/

相关文章:

python - Plotly Dash 无法动态创建图形

java - 发现异常或服务器正在运行时自动停止 "tail -f catalina.out"

python - Pandas DataFrame 中的交叉表

python Selenium : WinError 10053 - host is shutting connection down

python - 如何使用 python PIL 获取图像中的颜色集

用于变量命名以指示单位的 Python 约定

python - 如何在 PyCharm 中禁用 PEP 8 的特殊命名约定检查

python - 线路太长。 Django PEP8

python - 尝试从 Pandas Dataframe 中删除多行,但删除的行数超出预期

python - 将 groupby 选定的列作为字典移动到新的 pandas 列中