按 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()

如果您不希望 idproduct 显示为索引,请使用 groupby(['id', 'product'], as_index=False)。 或者使用:

df.groupby(['id','product']).tail(1)