如何对pandas数据帧的值进行分组并从每个组中选择最新的(按日期)?
例如,给定按日期排序的数据框:
id product date
0 220 6647 2014-09-01
1 220 6647 2014-09-03
2 220 6647 2014-10-16
3 826 3380 2014-11-11
4 826 3380 2014-12-09
5 826 3380 2015-05-19
6 901 4555 2014-09-01
7 901 4555 2014-10-05
8 901 4555 2014-11-01
按ID或产品分组,并选择最早的产品:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
答案 0 :(得分:36)
您还可以将tail
与groupby一起使用,以获取该组的最后n个值:
df.sort_values('date').groupby('id').tail(1)
id product date
2 220 6647 2014-10-16
8 901 4555 2014-11-01
5 826 3380 2015-05-19
答案 1 :(得分:25)
在idxmax
中使用groupby
并使用df
loc
切片df.loc[df.groupby('id').date.idxmax()]
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
def show
serialized_profile = ProfileSerializer.new(@profile, root: false,
scope: current_relationship,
couple_ser: @couple,
partners_ser: @partners)
respond_to do |format|
format.html
format.json { render json: serialized_profile }
end
end
答案 2 :(得分:0)
要将.tail()
用作聚合方法并保持分组完整:
df.sort_values('date').groupby('id').apply(lambda x: x.tail(1))
id product date
id
220 2 220 6647 2014-10-16
826 5 826 3380 2015-05-19
901 8 901 4555 2014-11-01
答案 3 :(得分:0)
我遇到了类似的问题,最终使用了popExitAnim
而不是drop_duplicates
。
与上面建议的其他方法相比,它似乎在大型数据集上的运行速度显着提高。
groupby
答案 4 :(得分:0)
鉴于按日期排序的数据框,您可以通过多种方式获得所需的内容:
赞:
df.groupby(['id','product']).last()
像这样:
df.groupby(['id','product']).nth(-1)
或类似这样:
df.groupby(['id','product']).max()
如果您不希望id
和product
显示为索引,只需添加.reset_index()
。
或者使用:
df.groupby(['id','product']).tail(1)