使用 python-pandas groupby-aggregate 函数获取值



所以我有一个看起来像这样的数据帧:

Date       Forward_Date    A    B    C    D   Amount
2010-01-01  2010-02-01     a    a    a    a     20
2010-01-01  2010-03-01     b    b    b    b     10
2010-01-01  2010-04-01     c    c    c    c      5
2010-01-02  2010-02-01     d    d    d    d     15
2010-01-02  2010-03-01     e    f    e    e     30
2010-01-02  2010-04-01     f    f    f    f     70 

我想得到的是这样的东西:

Date       Forward_Date    A    B    C    D   Amount
2010-01-01  2010-02-01     a    a    a    a     20
2010-01-02  2010-04-01     f    f    f    f     70 

因此,我想从数量最大的"日期"列中选择那些唯一条目,然后用相应的数据填充其他单元格。

我尝试了df.groupby(df['Date']).agg({'Amount':'max'}).reset_index()让我得到这个:

Date          Amount
2010-01-01      20
2010-01-02      70 

但是我无法使用这两个列值的交集填充其他列。 任何帮助将不胜感激!

Date列设置为索引,对Amount列执行 groupby,获取原始数据帧中等于 groupby 结果的行的布尔值,并使用loc进行索引:

df = df.set_index("Date")
df.loc[lambda x: x.Amount.eq(df.groupby("Date").Amount.max())]
Forward_Date    A   B   C   D   Amount
Date                        
2010-01-01  2010-02-01  a   a   a   a   20
2010-01-02  2010-04-01  f   f   f   f   70

最简单的解决方案是合并(内连接(您的输出日期和金额回到输入表,并获得所需的列,例如:

pd.merge(df,df.groupby(df['Date']).agg({'Amount':'max'}).reset_index(),on=['Date','Amount'])

这将按日期为您提供包含最大金额的整行

因此,在对几篇帖子进行了猛烈抨击(并且懒得看我自己的帖子XD(之后,我遇到了以下解决方案,该解决方案也有效:

df.sort_values(by = ['Amount'], ascending = False).drop_duplicates(subset = 'Date').sort_values(by = ['Date'])

请注意,Manish 和 Sammy 给出的解决方案也完美运行,并产生相同的数据帧。干杯!

最新更新