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

问题描述 投票:1回答:2

在根据条件更改数据框列时,我习惯了以下情况(在这种情况下,每位女性的工资为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'

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

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

python pandas pep8
2个回答
3
投票

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

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


2
投票

做就是了

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的每个值时才为真。

© www.soinside.com 2019 - 2024. All rights reserved.