【问题标题】:Pandas Aggregate/Group by based on most recent datePandas 根据最近日期聚合/分组
【发布时间】:2013-06-06 11:04:28
【问题描述】:

我有一个 DataFrame 如下,其中 Id 是一个字符串,Date 是一个日期时间:

Id    Date
1     3-1-2012
1     4-8-2013
2     1-17-2013
2     5-4-2013
2     10-30-2012
3     1-3-2013

我想合并表格,只为每个具有最近日期的 ID 显示一行。
关于如何做到这一点的任何想法?

【问题讨论】:

  • 他们的日期代表提交的日期,我只需要最近提交的,因为它取代了旧的行。

标签: python-2.7 pandas


【解决方案1】:

你可以groupbyId字段:

In [11]: df
Out[11]:
  Id                Date
0  1 2012-03-01 00:00:00
1  1 2013-04-08 00:00:00
2  2 2013-01-17 00:00:00
3  2 2013-05-04 00:00:00
4  2 2012-10-30 00:00:00
5  3 2013-01-03 00:00:00

In [12]: g = df.groupby('Id')

如果你不确定顺序,你可以做一些类似的事情:

In [13]: g.agg(lambda x: x.iloc[x.Date.argmax()])
Out[13]:
                  Date
Id
1  2013-04-08 00:00:00
2  2013-05-04 00:00:00
3  2013-01-03 00:00:00

每个组都抓取日期最大(最新)的行(argmax 部分)。

如果您知道它们是按顺序排列的,您可以选择最后一个(或第一个)条目:

In [14]: g.last()
Out[14]:
                  Date
Id
1  2013-04-08 00:00:00
2  2012-10-30 00:00:00
3  2013-01-03 00:00:00

(注意:它们不按顺序排列,因此在这种情况下不起作用!)

【讨论】:

    【解决方案2】:

    在 Hayden 的回复中,我认为使用 x.loc 代替 x.iloc 更好,因为 df 数据帧的索引可能是稀疏的(在这种情况下 iloc 将不起作用)。

    (我在 stackoverflow 上没有足够的积分将其发布在响应的 cmets 中)。

    【讨论】:

    • 死线程,但如果使用x.loc,我也会添加,然后还要在.groupby() 中使用as_index=False 参数来保留ID
    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 2016-01-20
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2021-07-22
    • 2017-04-30
    相关资源
    最近更新 更多