与 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
运算符保留用于对象 identity,not 用于 比较值平等。 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
实际上会产生一个布尔系列,前提是 a
和 b
也是一个 Pandas 系列。
顺便说一下,如果你想检查两个系列 a
和 b
之间的所有值是否一致,那么你应该评估 (a == b).all()
将整个系列减少为单个布尔值,当且仅当 a[i] == b[i]
对于 i
.
的每个值时,这将是 True
在根据条件更改数据框列时,我习惯了以下操作(在这种情况下,每个女人的工资都是 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
运算符保留用于对象 identity,not 用于 比较值平等。 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
实际上会产生一个布尔系列,前提是 a
和 b
也是一个 Pandas 系列。
顺便说一下,如果你想检查两个系列 a
和 b
之间的所有值是否一致,那么你应该评估 (a == b).all()
将整个系列减少为单个布尔值,当且仅当 a[i] == b[i]
对于 i
.