Pandas .loc and PEP8



我试着搜索了很多次,但都没有找到答案,所以这里是。。。

我经常使用panda来清理数据帧并使其符合我的需求。随之而来的是大量.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')]

我建议做两件事

  • 忽略PEP 8的80个字符建议,但尽量保持在120或150行
    保持一些行长度要求有助于可读性,但如果你试图在(例如(类方法中保持在80个字符,这将导致更差、可读性更低的代码

    PEP 8实际上有一节是关于这一点的,"愚蠢的一致性是小头脑的霍布哥布林",它描述了你应该偏离它的其他建议的情况,例如

    1. 应用指南会降低代码的可读性,即使对于习惯于阅读遵循此PEP的代码的人来说也是如此
  • .loc内容拆分为多行

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

当代码";看起来很糟糕";,尽管是有效的语法,但你会体验到它。实际上,PEP8和Cyclomatic Complexity检查器是帮助你以科学的方式对抗、防御和提出代码样式的工具。


如果你有很多布尔语句,你(通常必须(用括号把它们分解,以澄清它们的顺序

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

这与传统的Python运算符有点冲突,后者被建议用于前面的行(PEP8(,但我在形成布尔数组时对此提出了质疑,因为成员序列必须是相同的形状才能获得良好的结果,而且在使用几个数据帧时,当它们在视觉上对齐时,通常更容易观察和推理它们。

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

最新更新