【问题标题】:Pandas: Group by Name and Take Row With Most Recent DatePandas:按名称分组并按最近日期排列
【发布时间】:2018-12-22 01:14:08
【问题描述】:

我有一个带有 A, B, C, D, date 列的 Pandas DataFrame。我想过滤掉AB 的重复项,保留date 中具有最新值的行。

所以如果我有两行看起来像:

A B C D date

1 1 2 3 1/1/18

1 1 2 3 1/1/17

正确的输出是:

A B C D date

1 1 2 3 1/1/18

我可以通过循环来做到这一点,但我想使用df.groupby(['A', 'B']),然后通过取每个组中date 的最大值来聚合。

我试过了:

df.groupby(['A', 'B']).agg(lambda x: x.iloc[x.date.argmax()])

但我明白了:

AttributeError: 'Series' object has no attribute 'date'

知道我做错了什么吗?

编辑:嗯,如果我这样做:

df.groupby(['A', 'B']).UPDATED_AT.max()

我得到了我想要的大部分内容,但我丢失了 DC 列...

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以用

    df.date=pd.to_datetime(df.date)
    df.sort_values('date').drop_duplicates(['A','B'],keep='last')
       A  B  C  D       date
    0  1  1  2  3 2018-01-01
    

    【讨论】:

      【解决方案2】:

      试试df.groupby(['A', 'B']).agg(lambda x: x.iloc[x['date'].argmax()]) pandas 有自己的日期对象。也许 pandas 对系列名称感到困惑。

      【讨论】:

      • 有趣的想法,但只是将列更改为updated_at 和同样的问题:(
      【解决方案3】:
      df = pd.DataFrame([[1, 1, 2, 3, '1/1/18'],
                          [1, 1, 2, 3, '1/1/17']], 
                          columns=['A', 'B', 'C', 'D', 'date'])
      

      输出:

          A   B   C   D   date
      0   1   1   2   3   1/1/18
      1   1   1   2   3   1/1/17
      

      分组 d 删除重复项:

      df.groupby(['A', 'B']).agg(
          {
              'date': 'max'
          })
      

      输出:

              date
      A   B   
      1   1   1/1/18
      

      这应该可行。将“日期”列作为日期时间对象可能会更好。

      【讨论】:

        猜你喜欢
        • 2020-08-01
        • 2018-04-15
        • 2014-08-28
        • 2019-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 2016-01-31
        相关资源
        最近更新 更多