我有一个PANDAS数据框。当我创建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
答案 0 :(得分:2)
肯定有很多方法可以做到这一点。这是两个:
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
所以现在它的大小相同,我们可以直接将相等与相等的列进行比较。
请注意,如果最大值多次出现,则这两种方法也会返回重复项,这可能是您想要的,也可能不是。