按照pandas数据框分组,然后在每个组中选择最新的

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)

  • 我喜欢这个,因为它可以应用于不仅仅是日期. (4认同)
  • groupby 保留顺序,请参阅 /sf/ask/1851928781/ (3认同)

piR*_*red 30

使用idxmaxgroupby,切片dfloc

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)

  • 对于数百万条记录,该解决方案运行速度非常慢 (5认同)

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)

  • 我通常也使用这个,但希望更快的解决方案是使用 groupby。groupby 直观上更有意义,并且通常是我们解决这个问题的方式! (4认同)

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)

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

df.groupby(['id','product']).tail(1)
Run Code Online (Sandbox Code Playgroud)

  • 在我的测试中,当同一列中没有值时,last() 的行为与 nth() 略有不同。例如,如果组中的第一行的值为 1,而同一组中的其余行的值为 None,则尽管最后一行的值为 None,last() 将返回 1 作为值。另一方面,nth(-1) 将返回 None,这更像我所期望的。 (7认同)