按 pandas 数据框和每组中的 select 最新数据框分组
group by pandas dataframe and select latest in each group
如何对 pandas 数据框的值和每个组中的 select 最新(按日期)值进行分组?
例如,给定一个按日期排序的数据框:
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 或产品分组,select最早给出:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
在 groupby
中使用 idxmax
并使用 loc
切片 df
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
您还可以将 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
要使用 .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
我遇到了类似的问题,最终使用了 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
给定一个按日期排序的数据框,您可以通过多种方式获得您所要求的内容:
像这样:
df.groupby(['id','product']).last()
像这样:
df.groupby(['id','product']).nth(-1)
或者像这样:
df.groupby(['id','product']).max()
如果您不希望 id
和 product
显示为索引,请使用 groupby(['id', 'product'], as_index=False)
。
或者使用:
df.groupby(['id','product']).tail(1)
如何对 pandas 数据框的值和每个组中的 select 最新(按日期)值进行分组?
例如,给定一个按日期排序的数据框:
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 或产品分组,select最早给出:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
在 groupby
中使用 idxmax
并使用 loc
df
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
您还可以将 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
要使用 .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
我遇到了类似的问题,最终使用了 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
给定一个按日期排序的数据框,您可以通过多种方式获得您所要求的内容:
像这样:
df.groupby(['id','product']).last()
像这样:
df.groupby(['id','product']).nth(-1)
或者像这样:
df.groupby(['id','product']).max()
如果您不希望 id
和 product
显示为索引,请使用 groupby(['id', 'product'], as_index=False)
。
或者使用:
df.groupby(['id','product']).tail(1)