是否可以跨多行分割一系列pandas命令?

use*_*117 13 python pandas

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

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

我希望能够跨多行呈现它,但仍然作为一个衬垫(不将结果保存到临时对象,或将lambda定义为函数)

我希望它看起来如何的一个例子:

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

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

Gar*_*hop 15

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

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

要么

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


Zol*_*oli 10

包装长行的首选方法是在括号,方括号和花括号内使用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)
Run Code Online (Sandbox Code Playgroud)

最后一个打印的表达式变量“ _”仅在Python控制台中是已知的,因此,如果没有显式属性,则不能在脚本/模块中将其用于此目的。

  • 我认为这应该被接受,因为它基于广泛接受的标准,而不是关于看起来更好的意见 (4认同)

Mat*_*ipp 5

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

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

我花了很长时间才意识到我可以在点之前打破这些表达式,这通常比在括号内打破更具可读性(对于“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)
)
Run Code Online (Sandbox Code Playgroud)

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

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