所以我有一个看起来像这样的数据帧:
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 给出的解决方案也完美运行,并产生相同的数据帧。干杯!