熊猫:按名称分组并以最近的日期进行排行

时间:2018-12-22 01:14:08

标签: python pandas

我有一个列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列...

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

这应该有效。将'date'列用作datetime对象可能会更好。