首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >groupby和aggregation后的输出

groupby和aggregation后的输出
EN

Stack Overflow用户
提问于 2019-02-10 08:57:17
回答 1查看 31关注 0票数 0

我有一个熊猫数据框。当我创建GROUP BY和聚合函数(如min或max )时,我只能得到部分结果,即我在数值列上进行min/max聚合的列。我怎样才能得到全行(即所有与这个最小/最大值相对应的数据)?

数据帧看起来像这样:

代码语言:javascript
复制
Place    Year   Time        TimeS
BOSTON   1973   02:16:03    8163
FUKUOKA  1973   02:11:45    7905
NEW YORK 1973   02:21:54    8514
BERLIN   1974   02:44:53    9893
BOSTON   1974   02:13:39    8019
FUKUOKA  1974   02:11:32    7892
NEW YORK 1974   02:26:30    8790

我希望每年和城市实现的最小或最大时间。我只能通过(马拉松是pandas.DataFrame的名字)来获取时间

代码语言:javascript
复制
marathon.groupby('year').TimeS.max()

这给了我们:

代码语言:javascript
复制
1973    02:21:54
1974    02:44:53

我怎么能有和这个时间相对应的地点呢?即:

代码语言:javascript
复制
NEW YORK   1973    02:21:54
BERLIN     1974    02:44:53
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-10 09:16:44

当然,有很多方法可以做到这一点。这里有两个:

代码语言:javascript
复制
marathon[marathon.TimeS == marathon.groupby('Year').TimeS.transform('max')]

代码语言:javascript
复制
marathon[marathon.TimeS.isin(marathon.groupby('Year').TimeS.max())]

让我们看看这些中间对象中的一些

代码语言:javascript
复制
In [29]: marathon.groupby('Year').TimeS.max()
Out[29]:
Year
1973    8514
1974    9893
Name: TimeS, dtype: int64

所以我们得到了一个序列,但只有两个值。因此,我们可以在列值等于其中之一的地方对数据帧进行索引,这是第二种解决方案。

第一个解决方案改用transform('max'),它保留了数据帧的大小:

代码语言:javascript
复制
In [30]: marathon.groupby('Year').TimeS.transform('max')
Out[30]:
0    8514
1    8514
2    8514
3    9893
4    9893
5    9893
6    9893
Name: TimeS, dtype: int64

所以现在它的大小是一样的,我们可以直接把相等性和它相等的列进行比较。

请注意,如果最大值多次出现,这两个方法也将返回副本-这可能是您想要的,也可能不是您想要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54612373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档