是否可以对 groupby 的结果进行 groupby?

Is it possible to do a groupby on the result of a groupby?

我认为我不需要共享整个数据框,但基本上,这是有问题的代码行(当然 pandas 已经导入)

divstack = df[df['Competitor']=='Emma Slabach'].groupby(['Division','Stack'])['Time'].min()

输出为:

>>> divstack
Division  Stack 
6U F      3/3/03     2.66
          3/6/03     4.81
          Cycle     13.89
7-8 F     3/3/03     2.41
          3/6/03     2.68
          Cycle      7.71
9-10 F    3/3/03     2.13
          3/6/03     2.75
          Cycle      6.94
Name: Time, dtype: float64

我已经抓到了Emma的最快时间是2.13,感谢这行代码:

emma = df[df['Competitor']=='Emma Slabach'].groupby(['Competitor'])['Time'].min()

输出为:

>>> emma
Competitor
Emma Slabach    2.13 
Name: Time, dtype: float64

但是我要如何修改之前的第一行代码以专门获取她最快时间出现的 DivisionStack(以及 Time)? (9-10F 部门和 Stack 3/3/03)。

我认为函数不是必需的,但是有没有一种方法可以在我得到的第一个 groupby 输出 (divstack) 之上执行另一个 groupby,以进一步 "minimize" 和得到她最快的时间? 或者我可以在 divstack 的某处输入 emma 以获得那个时间发生的 division/stack 吗?

我需要将除法、堆栈和时间存入divstack

我认为您正在寻找 idxmin 函数 https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.core.groupby.DataFrameGroupBy.idxmin.html

result = df.loc[df.groupby('Competitor').Time.idxmin()]

应该为每个竞争对手提供您想要的东西。如果需要,只需过滤 Emma:result.loc[result.Competitor == 'Emma Slabach']

In [6]: df = pd.DataFrame([['Emma Slabach', '6U F',  '3/3/03', 2.66], ['Emma Slabach', '7-8 F', '3/3/03', 2.41], ['Roger', '6U F', '3/3/03', 3.80]], columns=['Competitor', 'Div
   ...: ision', 'Stack', 'Time'])

In [7]: df
Out[7]: 
     Competitor Division   Stack  Time
0  Emma Slabach     6U F  3/3/03  2.66
1  Emma Slabach    7-8 F  3/3/03  2.41
2         Roger     6U F  3/3/03  3.80

In [8]: df.loc[df.groupby('Competitor').Time.idxmin()]
Out[8]: 
     Competitor Division   Stack  Time
1  Emma Slabach    7-8 F  3/3/03  2.41
2         Roger     6U F  3/3/03  3.80

给定 divstack,您可以使用 .locmin() 检索完整的 MultiIndex 条目:

divstack.loc[divstack.eq(divstack.min())]

Division  Stack 
9-10 F    3/3/03    2.13
Name: Time, dtype: float64