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)
我建议两件事
忽略PEP 8的 80 个字符的建议,但尽量保持在 120 或 150 行
保持一些行长要求有助于提高可读性,但是如果您试图在(例如)类方法中保持 80 个字符,它将导致更糟糕和可读性更低的代码
PEP 8 实际上有一个部分,A Foolish Consistency is the Hobgoblin of Little Minds,它描述了您应该偏离其他建议的情况,例如
- 应用该指南会使代码的可读性降低,即使对于习惯阅读遵循此 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 时,如果可能的话,您绝对应该针对部分和完整数据尝试多种可能性,以得出良好的性能结论,将它们的可读性放在第二位,并提供关于您的研究等的出色评论和链接等。特别的风格。