与熊猫中的布尔相比,我是否必须偏离PEP 8样式约定?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与熊猫中的布尔相比,我是否必须偏离PEP 8样式约定?相关的知识,希望对你有一定的参考价值。

在根据条件更改数据框列时,我习惯了以下情况(在这种情况下,每位女性的工资为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 Style常规检查器(在Spyder中)建议在第3行:

与True的比较应为'如果cond为True:'或'if cond:'

将最后一行更改为

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

产量

KeyError:'不能使用单个bool索引到setitem'

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

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

答案

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

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

另一答案

做就是了

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

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

顺便说一句,最后一句话正是为什么is永远不会工作的原因。在Python中,None运算符保留用于对象标识,而不是用于比较相等的值。 df ['female']将永远是一个系列(如果df是一个Pandas数据帧),一个系列将永远不会与单个系列相同(对象)

要理解这一点,请更好地考虑英语中“等于”和“相同”之间的差异。在德语中,这是'selbe'(身份)和'gleiche'(平等)之间的区别。在其他语言中,这种区别并不明确。

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

顺便说一句,如果你想检查两个系列b(a == b).all()之间的所有值是否一致,那么你应该评估a[i] == b[i],它将整个系列减少到一个布尔值,当且仅当i为qazxswpoi的每个值时才为真。

以上是关于与熊猫中的布尔相比,我是否必须偏离PEP 8样式约定?的主要内容,如果未能解决你的问题,请参考以下文章

遵循PEP 8风格指南

Python 编写代码 检查是否遵循PEP 8标准

你如何 PEP 8 命名一个名称是首字母缩略词的类?

将布尔(Property)绑定到JavaFX中的List操作

根据 PEP257 自动检查文档字符串样式的工具 [关闭]

PEP 8 -- Python代码格式规则