我有一个熊猫数据框。当我创建GROUP BY和聚合函数(如min或max )时,我只能得到部分结果,即我在数值列上进行min/max聚合的列。我怎样才能得到全行(即所有与这个最小/最大值相对应的数据)?
数据帧看起来像这样:
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的名字)来获取时间
marathon.groupby('year').TimeS.max()这给了我们:
1973 02:21:54
1974 02:44:53我怎么能有和这个时间相对应的地点呢?即:
NEW YORK 1973 02:21:54
BERLIN 1974 02:44:53发布于 2019-02-10 09:16:44
当然,有很多方法可以做到这一点。这里有两个:
marathon[marathon.TimeS == marathon.groupby('Year').TimeS.transform('max')]或
marathon[marathon.TimeS.isin(marathon.groupby('Year').TimeS.max())]让我们看看这些中间对象中的一些
In [29]: marathon.groupby('Year').TimeS.max()
Out[29]:
Year
1973 8514
1974 9893
Name: TimeS, dtype: int64所以我们得到了一个序列,但只有两个值。因此,我们可以在列值等于其中之一的地方对数据帧进行索引,这是第二种解决方案。
第一个解决方案改用transform('max'),它保留了数据帧的大小:
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所以现在它的大小是一样的,我们可以直接把相等性和它相等的列进行比较。
请注意,如果最大值多次出现,这两个方法也将返回副本-这可能是您想要的,也可能不是您想要的。
https://stackoverflow.com/questions/54612373
复制相似问题