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

时间:2017-01-07 20:03:31

标签: python pandas group-by 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

按ID或产品分组,并选择最早的产品:

    id     product   date
2   220    6647     2014-10-16
5   826    3380     2015-05-19
8   901    4555     2014-11-01

5 个答案:

答案 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()

如果您不希望idproduct显示为索引,只需添加.reset_index()。 或者使用:

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