【问题标题】:What is the correct syntax for groupby max mingroupby max min 的正确语法是什么
【发布时间】:2022-06-12 06:18:23
【问题描述】:

我关注 this answer 但是,我无法为我的目的获得正确的语法

df.head()
            country             league   Win   DNB  O 1.5  U 4.5
113         Iceland  Urvalsdeild Women  3.19  3.43   4.89   2.10
135         Belgium     Jupiler League  1.99  1.99   3.59   2.40
165          Brazil            Serie D  1.71  1.98   3.80   1.90
238  Czech Republic         U19 League  2.90  2.90   4.70   2.25
244           China         Jia League  2.42  0.94   4.80   2.00

我想要countryleague max of ('Win', 'DNB', 'O 1.5')min of ('U 4.5')

我在努力

df= df.groupby('country', 'league).agg({'Win':'max', 'DNB':'max', 'O 1.5':'max', 'U 4.5': 'min'})[['Win', 'DNB', 'O 1.5', 'U 4.5']].reset_index()

但是我收到了SyntaxError: invalid syntax

正确的语法是什么?

【问题讨论】:

  • 我不知道其余的是否正确,但是您的groupby 是错误的。您需要将其更改为:df.groupby(['country', 'league']).agg(...

标签: python dataframe group-by max min


【解决方案1】:

语法错误是因为'league 后面缺少引号 (')。但是,如果你解决了这个问题,你会得到另一个错误:

ValueError: No axis named league for object type DataFrame

错误是因为传递df.groupby('country', 'league') 等价于df.groupby(by='country', axis='league')(第一种情况是传递位置参数,第二种情况是传递关键字参数)。

您的问题表明您想同时使用国家和联赛作为 grouper,因此请使用方括号 ([]) 来表示。

仅供参考,groupby 也有 as_index 参数,默认为 True。如果您稍后要使用reset_index,请从头开始将as_index 传递为False,这样您就不需要reset_index

另外,groupby.agg(...) 输出一个数据帧,其列仅是传递给agg 的列,因此无需像[[...]] 那样再次索引它们。

最终代码:

df.groupby(['country', 'league'], as_index=False).agg({'Win':'max', 'DNB':'max', 'O 1.5':'max', 'U 4.5': 'min'})

【讨论】: