Python 当我与《熊猫》中的布尔人相比时,我是否必须偏离PEP 8风格的惯例?
在根据条件修改数据帧列时(在本例中,每个女性的工资为200),我习惯于使用以下方法 PEP 8样式约定检查器(在Spyder中)在第3行中建议: 与True的比较应为“if cond is True:”或“if cond:” 将最后一行更改为Python 当我与《熊猫》中的布尔人相比时,我是否必须偏离PEP 8风格的惯例?,python,pandas,pep8,Python,Pandas,Pep8,在根据条件修改数据帧列时(在本例中,每个女性的工资为200),我习惯于使用以下方法 PEP 8样式约定检查器(在Spyder中)在第3行中建议: 与True的比较应为“if cond is True:”或“if cond:” 将最后一行更改为 df.loc[df['female'] is True,'wage'] = 200 屈服 KeyError:“无法使用单个布尔索引到集合项” 因为现在语句的计算结果是单个布尔值,而不是序列 在这种情况下,是否必须偏离造型惯例 您应该在不进行比较的情况下使
df.loc[df['female'] is True,'wage'] = 200
屈服
KeyError:“无法使用单个布尔索引到集合项”
因为现在语句的计算结果是单个布尔值,而不是序列
在这种情况下,是否必须偏离造型惯例 您应该在不进行比较的情况下使用
df['female']
,而不是与任何运算符进行True
比较df['female']
已经是您需要的掩码
用==
来比较True
几乎总是一个坏主意,即使是在小动物或熊猫身上。就这么做吧
df.loc[df['female'], 'wage'] = 200
实际上,df['female']
作为一个布尔级数,其值与通过计算df['female']==True返回的布尔级数值完全相同,后者也是一个布尔级数。(系列是一个术语,类似于数据帧中的单个列)
顺便说一下,最后一句话正是为什么df['female']是真的
永远不会起作用。在Python中,is
操作符保留用于对象标识,not用于比较相等值。df['female']将始终是一个系列(如果df是一个数据帧),并且一个系列将永远不会与单个数据帧相同(对象)
为了更好地理解这一点,请思考英语中“equal”和“same”之间的区别。在德语中,这就是“selbe”(身份)和“gleiche”(平等)之间的区别。在其他语言中,这种区别并不那么明显
因此,在Python中,您可以将(对一个)对象的引用与(特殊对象)None
与:进行比较,如果obj为None:…
,甚至可以检查两个变量(“Python术语中的名称”)是否指向与完全相同的对象,如果a为b
。但是这个条件保持是一个比仅仅比较等式a==b强得多的断言。事实上,计算表达式a==b
的结果可能是任何东西,而不仅仅是一个布尔值。这完全取决于a
所属的类,即其类型。在您的上下文中,如果a
和b
也是一个布尔序列,那么a==b
实际上会生成一个布尔序列
顺便说一下,如果您想检查两个系列a
和b
之间的所有值是否一致,那么您应该计算(a==b)。all()
将整个系列减少为单个布尔值,当且仅当a[i]==b[i]时,该值才为真
对于i
的每一个值,如果它不起作用,则为是。可能会对你有帮助。如果你做了df.loc[(df['female']是真的),'wage']
,会发生什么?我不知道的关联性规则是
,所以它可能被解释为df.loc[df['female']是(True,'wage')]
,我不认为这是你的意思。这会产生相同的关键错误。我不想添加新的答案,但我认为这应该包括提到1==True#True
vs1是True#False
OK,我偶尔也会这样做。但是如果我需要检查一个条件是否为假呢~df['female']
?@E.Sommer:是的,使用~
。如果df['female']
也有非bool
值,例如字符串,该怎么办?不检查==True
也会选择那些行。@MichaelLitvin:在这种情况下,首先,您在那里有一个非常奇怪的列,其次,==True
也会选择任何值为1
、1.0
的行,或者任何其他与True
比较的行。在这种情况下,您可能需要类似于df['female'].apply(lambda x:x为True)
的内容,或者如果您希望允许numpy.bool
或其他类似bool的类型的实例,则需要更奇怪的内容。
df.loc[df['female'], 'wage'] = 200