Python 是否可以根据groupby的结果执行groupby?
我不认为我需要共享整个数据帧,但基本上,这是有问题的代码行(当然,熊猫已经被导入) 输出为:Python 是否可以根据groupby的结果执行groupby?,python,python-2.7,pandas,pandas-groupby,Python,Python 2.7,Pandas,Pandas Groupby,我不认为我需要共享整个数据帧,但基本上,这是有问题的代码行(当然,熊猫已经被导入) 输出为: >>> 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
>>> 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
但是,我如何修改前面的第一行代码,以具体获得她最快时间出现的时间的分割
和堆栈
(以及时间
)?(第9-10F部分和烟囱3/3/03)
我不认为函数是必要的,但是有没有一种方法可以在我得到的第一个groupby输出(divstack
)的基础上执行另一个groupby,以进一步“最小化”并获得最快的时间?
或者我可以在divstack
中的某个地方输入emma
,以获得当时发生的分区/堆栈吗
我需要将除法、堆栈和时间存储到
divstack
我想您正在寻找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
,您可以使用.loc
和min()
检索完整的多索引项:
你不知道怎么过滤艾玛吗?当我尝试
df.loc[df.groupby(['Competitor']=='Emma Slabach').Time.idxmin()]
时,我得到了KeyError:False
以及数据帧中的其他列,但我特别需要除法、堆栈和Time@zainy我刚刚更新了我的答案:命名groupby结果,然后过滤Emma的结果。这更清楚吗?您只能按列分组。您不能按表达式分组(我不确定这是什么意思)<代码>['Competitor']=='Emma Slabach'是一个表达式,而不是dataframeYeah中现有的列。这很有意义,谢谢。只是看看我是如何删除输出中的一些列!顺便问一下,你知道为什么时间列的名称在你的代码和我的原始代码中都没有出现吗?不客气!当您对单个变量应用聚合函数时,您将得到一个系列
作为输出。它只是一个向量,所以它不会被名称引用,就像在多列数据帧中一样。但是,正如您在输出中看到的,它仍然被称为时间。您还可以使用divstack.name
(您将看到它等于'Time'
)。
result = df.loc[df.groupby('Competitor').Time.idxmin()]
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.loc[divstack.eq(divstack.min())]
Division Stack
9-10 F 3/3/03 2.13
Name: Time, dtype: float64