Pandas .loc 和 PEP8

Tom*_*son 6 python pep8 pandas

我已经尝试搜索了很多次,但我没有看到它的答案,所以在这里......

我经常使用 Pandas 来清理数据框并使其符合我的需求。随之而来的是很多 .loc 访问以查询它并返回值。根据我在做什么(和列长度),这可能会变得很长。鉴于 PEP8 限制为每行 79 个字符,是否有任何最佳实践?下面的一些示例(这些是简化的并用于解释目的):

missing_address_df = address_df.loc[address_df['address'].notnull()].copy()
Run Code Online (Sandbox Code Playgroud)

或多个查询点:

nc_drive_df = address.loc[(address_df['address'].str.contains('drive')) & (address_df['state'] == 'NC')]
Run Code Online (Sandbox Code Playgroud)

ti7*_*ti7 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')
    ]
    
    Run Code Online (Sandbox Code Playgroud)

尽管是有效的语法,但很难客观地判断代码何时“看起来很糟糕”,但您会体验到它。实际上,PEP 8 和Cyclomatic Complexity checkers 是可以帮助您以科学的方式对抗、捍卫和提出代码风格的工具。


如果您有很多布尔语句,您(通常必须)用括号将它们分开以阐明它们的顺序

nc_drive_df = address.loc[
    (
        (address_df['address'].str.contains('drive')) & \
        (address_df['state'] == 'NC')
    ) || (
        address_df['zip'] == "00000"
    )
]
Run Code Online (Sandbox Code Playgroud)

这与建议在行( PEP8 ) 之前的传统 Python 运算符有些冲突,但我在形成 Pandas 布尔数组时对此提出挑战,因为数据帧必须相同才能获得良好的结果,并且在以下情况下可能更容易观察到这一点第一次处理许多数据帧。

最后,通常在做科学 Python 时,如果可能的话,您绝对应该针对部分和完整数据尝试多种可能性,以得出良好的性能结论,将它们的可读性放在第二位,并提供关于您的研究等的出色评论和链接等。特别的风格。

  • 在这种情况下,您甚至不需要`\\`。 (2认同)