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

时间:2017-12-15 16:31:21

标签: python python-2.7 pandas pandas-groupby

我认为我不需要分享整个数据帧,但基本上,这是有问题的代码行(当然已经导入了大熊猫)

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,以进一步"最小化&#34 34;并获得她最快的时间? 或者我可以在emma中的某处输入divstack以获得该时间发生的分区/堆栈吗?

我需要将分区,堆栈和时间存储到divstack

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我认为你正在寻找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