与 pandas 中的布尔值进行比较时,我是否必须偏离 PEP 8 样式约定?

Do I have to deviate from PEP 8 style conventions when comparing to booleans in pandas?

在根据条件更改数据框列时,我习惯了以下操作(在这种情况下,每个女人的工资都是 200)。

import pandas as pd
df = pd.DataFrame([[False,100],[True,100],[True,100]],columns=['female','wage'])
df.loc[df['female'] == True,'wage'] = 200

PEP 8 样式约定检查器(在 Spyder 中)在第 3 行中推荐:

comparison to True should be 'if cond is True:' or 'if cond:'

将最后一行更改为

df.loc[df['female'] is True,'wage'] = 200

产量

KeyError: 'cannot use a single bool to index into setitem'

因为现在语句被评估为单个布尔值而不是系列。

这是一种必须偏离样式约定的情况吗?

您应该使用没有比较的 df['female'],而不是使用任何运算符与 True 进行比较。 df['female']已经是你需要的面具了

True== 进行比较几乎总是一个坏主意,即使在 NumPy 或 Pandas.

中也是如此

就这样

df.loc[df['female'], 'wage'] = 200 

实际上df['female']作为一个布尔级数与df['female'] == True求值返回的布尔级数具有完全相同的,这也是一个布尔级数. (系列是 Pandas 术语,就像数据框中的单个列)。

顺便说一下,最后一条语句正是为什么 df['female'] is True 永远不会起作用的原因。在 Python 中,is 运算符保留用于对象 identitynot 用于 比较值平等。 df['female'] 将始终是一个系列(如果 df 是一个 Pandas 数据帧)并且一个系列永远不会与单个

相同(对象)

为了更好地理解这一点,想想英语中 'equal' 和 'same' 之间的区别。在德语中,这是 'selbe'(身份)和 'gleiche'(平等)之间的区别。在其他语言中,这种区别并不那么明确。

因此,在 Python 中,您可以将一个(对一个)对象的引用与(特殊对象)None 与:if obj is None : ... 进行比较,甚至可以检查两个变量('names' 在 Python 术语中)指向与 if a is b 完全相同的对象。但是这个条件成立比仅仅比较相等 a == b 是一个更强大的断言。事实上,计算表达式 a == b 的结果可能是任何东西,而不仅仅是一个布尔值。这完全取决于 class a 属于什么,即它的类型是什么。在您的上下文中,a == b 实际上会产生一个布尔系列,前提是 ab 也是一个 Pandas 系列。

顺便说一下,如果你想检查两个系列 ab 之间的所有值是否一致,那么你应该评估 (a == b).all() 将整个系列减少为单个布尔值,当且仅当 a[i] == b[i] 对于 i.

的每个值时,这将是 True