【问题标题】:How do I aggregate rows in a pandas dataframe according to the latest dates in a column?如何根据列中的最新日期聚合 pandas 数据框中的行?
【发布时间】:2021-07-22 03:00:25
【问题描述】:

我有一个包含材料、购买日期和购买价格的数据框。我想过滤我的数据框,以便我只保留包含每种材料的一行,并且该行包含最新购买日期的材料和相应的价格。

我怎样才能做到这一点?我绞尽脑汁想弄清楚如何将聚合函数应用于此,但我就是不知道如何。

【问题讨论】:

  • 在下面发布了我的答案。如果您发布一些示例数据,我可以确认一切正常。如果没有,以下应该可以正常工作(多次完成)。
  • 非常感谢!像魅力一样工作。你是个传奇。
  • 没问题,如果您不介意接受我的回答,我将不胜感激!

标签: python pandas pandas-groupby aggregation


【解决方案1】:

进行多重排序,然后使用删除重复项,保留第一次出现。

import pandas as pd

df.sort_values(by=['materials', 'purchase_date'], ascending=[True, False], inplace=True)
df.drop_duplicates(subset=['materials'], keep='first', inplace=True)

【讨论】:

    【解决方案2】:

    两步

    1. sort_values() by ma​​terialpurchaseDate
    2. groupby() 材料并占据第一行
    d = pd.date_range("1-apr-2020", "30-oct-2020", freq="W")
    
    df = pd.DataFrame({"material":np.random.choice(list("abcd"),len(d)), "purchaseDate":d, "purchasePrice":np.random.randint(1,100, len(d))})
    df.sort_values(["material","purchaseDate"], ascending=[1,0]).groupby("material", as_index=False).first()
    
    

    输出

    material purchaseDate purchasePrice
    0 a 2020-09-27 00:00:00 85
    1 b 2020-10-25 00:00:00 54
    2 c 2020-10-11 00:00:00 21
    3 d 2020-10-18 00:00:00 45

    【讨论】:

      猜你喜欢
      • 2013-06-06
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多