Dev*_*vEx 42 python group-by pandas pandas-groupby
如何对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
Run Code Online (Sandbox Code Playgroud)
按ID或产品分组,并选择最早的给出:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
Run Code Online (Sandbox Code Playgroud)
ade*_*e1e 49
您还可以使用tailgroupby获取组的最后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
Run Code Online (Sandbox Code Playgroud)
piR*_*red 30
使用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
Run Code Online (Sandbox Code Playgroud)
Dam*_*ier 24
我遇到了类似的问题,最终使用drop_duplicates而不是groupby.
与上面建议的其他方法相比,它在大型数据集上的运行速度似乎明显更快。
df.sort_values(by="date").drop_duplicates(subset=["id"], keep="last")
id product date
2 220 6647 2014-10-16
8 901 4555 2014-11-01
5 826 3380 2015-05-19
Run Code Online (Sandbox Code Playgroud)
San*_*rsu 15
给定按日期排序的数据框,您可以通过多种方式获得所需的内容:
像这样:
df.groupby(['id','product']).last()
Run Code Online (Sandbox Code Playgroud)
像这样:
df.groupby(['id','product']).nth(-1)
Run Code Online (Sandbox Code Playgroud)
或者像这样:
df.groupby(['id','product']).max()
Run Code Online (Sandbox Code Playgroud)
如果您不想id并product显示为索引,请使用groupby(['id', 'product'], as_index=False). 或者使用:
df.groupby(['id','product']).tail(1)
Run Code Online (Sandbox Code Playgroud)