分组和汇总后的输出

时间:2019-02-10 00:57:17

标签: python pandas-groupby

我有一个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

1 个答案:

答案 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

所以现在它的大小相同,我们可以直接将相等与相等的列进行比较。

请注意,如果最大值多次出现,则这两种方法也会返回重复项,这可能是您想要的,也可能不是。