我有以下 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 True
或 if 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/