【问题标题】:Is it possible to split a sequence of pandas commands across multiple lines?是否可以将一系列 pandas 命令拆分为多行?
【发布时间】:2021-05-21 02:12:44
【问题描述】:

我有一长串 pandas 链式命令,例如:

df.groupby[['x','y']].apply(lambda x: (np.max(x['z'])-np.min(x['z']))).sort_values(ascending=False)

而且我希望能够跨多行呈现它,但仍以单行的形式呈现(无需将结果保存到临时对象,或将 lambda 定义为函数)

我希望它的外观示例:

df.groupby[['x','y']]
.apply(lambda x: (np.max(x['z'])-np.min(x['z'])))
.sort_values(ascending=False)

有可能吗? (我知道'_'在python中有这个功能,但它似乎不适用于链式命令)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    在python中,您可以通过以反斜杠结束行或将表达式括在括号中来继续下一行。

    df.groupby[['x','y']] \
    .apply(lambda x: (np.max(x['z'])-np.min(x['z']))) \
    .sort_values(ascending=False)
    

    (df.groupby[['x','y']]
    .apply(lambda x: (np.max(x['z'])-np.min(x['z'])))
    .sort_values(ascending=False))
    

    【讨论】:

    • 虽然这是正确的语法,但它相当不符合 Python 标准,因为它使代码很难阅读。
    • 我同意,我不喜欢任何一个选项。
    • 我理解并同意,对于阅读代码而言,这不是最佳选择,但是在幻灯片中展示代码时,我认为这比将其拆分为额外的行更清楚。你不这么认为吗?
    • 在幻灯片中看起来很完美。我一直在用 Javascript 编写这样的代码。在 Python 中,我通常避免使用反斜杠形式。与缩进一起使用的括号可以,IMO。
    • 分配给一个新的DataFrame:df_cities = (df.groupby(['place_name'])['agent_count'] .sum() .reset_index() .sort_values(by='agent_count', ascending=False))
    【解决方案2】:

    包装长行的首选方法是使用 Python 的隐含 圆括号、方括号和大括号内的行继续。排长龙 可以通过将表达式包装在多行中 括号。这些应该优先使用反斜杠 续行

    来自https://www.python.org/dev/peps/pep-0008/#id19

    所以可能会更好:

    df.groupby[['x', 'y']].apply(
        lambda x: (np.max(x['z'])-np.min(x['z']))
    ).sort_values(ascending=False)
    

    最后打印的表达式变量“_”仅在 Python 控制台中已知,因此如果没有明确的归属,则不能在脚本/模块中用于该目的。

    【讨论】:

    • 我认为这应该是被接受的答案,因为它是基于一个被广泛接受的标准,而不是关于看起来更好的意见
    【解决方案3】:

    由于这具有命令的性质,我可能会将其格式化为接近您的示例,如下所示:

    df.groupby[['x','y']] \
        .apply(lambda x: np.max(x['z'])-np.min(x['z'])) \
        .sort_values(ascending=False)
    

    我花了很长时间才意识到我可以在点之前打破这些表达式,这通常比在括号内打破更具可读性(“some long string”.format() 也是如此)。

    如果这更像是表达式评估,我会将整个内容括在括号中,这被认为比行继续标记更“Pythonic”:

    var = (
        df.groupby[['x','y']]
            .apply(
                lambda x: np.max(x['z'])-np.min(x['z'])
            ) 
            .sort_values(ascending=False)
    )
    

    更新自从写这篇文章以来,我已经尽可能地避免使用反斜杠来继续行,包括在这里,在不将其分配给变量或将其传递给变量的情况下链接操作是没有意义的功能。我还切换到对括号或括号内的每一级嵌套使用一级缩进,以避免深入和/或获得摇摆不定的效果。所以我现在会这样写你的表达式:

     var = (
        df
        .groupby[['x','y']]
        .apply(
            lambda x: np.max(x['z']) - np.min(x['z'])
        ) 
        .sort_values(ascending=False)
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      相关资源
      最近更新 更多