Pandas .loc and PEP8

6

我试图搜索这个问题好几次,但是似乎没有得到答案,所以在这里问一下...

我常常使用pandas来清理dataframe并将其调整为我的需要。随之而来的是很多的".loc"访问来查询并返回值。根据我正在做什么(和列的长度),这可能会变得相当冗长。考虑到PEP8限制每行79个字符,有没有任何最佳实践?以下是一些简化和说明性质的例子:

missing_address_df = address_df.loc[address_df['address'].notnull()].copy()

或多个查询点:

nc_drive_df = address.loc[(address_df['address'].str.contains('drive')) & (address_df['state'] == 'NC')]

1
你可以将链接的方法调用拆分成多行 - 我相信PEP8本身就有这样的例子。 - MattDMo
@MattDMo 是的,我已经看了一些链式方法调用。然而,我更关注的是当.loc行太长时,它本身超出了79个字符的情况。例如 - address_to_be_df ['address name column'] = address_to_be_df ['address name columns'] .astype('int')。在这个例子中,我并不是真正的方法链接。我想知道是否有更具视觉吸引力的方法来分解变量选择。 - Tom Watson
1个回答

7
我建议两件事情
忽略PEP 8的80个字符建议,但尽量保持在120或150行内。 保持一定的行长度要求有助于可读性,但如果你试图将类方法限制在80个字符内,会导致代码更糟糕、不易读。 实际上,PEP 8中有一节A Foolish Consistency is the Hobgoblin of Little Minds专门描述了应该偏离其它建议的情况。
  1. 当遵循该指南会使代码变得不易读,即使对于习惯阅读遵循该PEP的代码的人也是如此。
.loc的内容拆分成多行:
nc_drive_df = address.loc[
    (address_df['address'].str.contains('drive')) & \
    (address_df['state'] == 'NC')
]

尽管代码的语法是有效的,但要客观地评判它是否“看起来糟糕”是很困难的,但你会有这种体验。实际上,PEP 8和圈复杂度检查器是帮助你以科学的方式对抗、捍卫和提出代码风格的工具。
如果你有很多布尔语句,你通常需要用括号来分隔它们,以明确它们的顺序。
nc_drive_df = address.loc[
    (
        (address_df['address'].str.contains('drive')) & \
        (address_df['state'] == 'NC')
    ) || (
        address_df['zip'] == "00000"
    )
]

这与传统的Python运算符有些冲突,传统上建议在行之前使用(PEP8),但是当形成布尔数组时,我对此提出了质疑,因为成员Series必须具有相同的形状才能得到良好的结果,并且在处理多个DataFrame时,当它们在视觉上对齐时,更容易观察和推理。
最后,在进行科学Python编程时,您应该尽可能地针对部分和完整数据尝试多种可能性,以得出良好的性能结论,其可读性次之,并提供关于您的研究的优秀评论和链接等,而不是特定的风格。

2
在这种情况下,甚至不需要使用 \\ - DYZ
真 - 一些代码检查工具要求这样做,但它也可能会干扰某些搜索(使\s*无效)! - ti7
任何需要在这种情况下使用 \ 的代码检查工具都是不好的工具。 - Marius Gedminas
此外,保持运算符'&'在其操作对象的左侧。 - Ricardo Udenze
@RicardoUdenze 这完全是个人风格选择,不是我推荐的方式 - 如果有多种运算符,请明确地提供括号以澄清所需的操作顺序 - ti7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接