首页 > 解决方案 > 去重记录(窗口函数熊猫)

问题描述

嗨,我希望删除按取消日期订购的记录,所以我只会对最近的记录感兴趣。

样本数据

ID 取消日期 type_of_fruit
1 2021-03-02 苹果
1 2021-01-01 苹果
2 2021-02-01

预期产出

ID 取消日期 type_of_fruit
1 2021-03-02 苹果
2 2021-02-01

我写了SQL方式,但我必须在熊猫中实现这个逻辑,请帮忙

SELECT 
    * 
FROM 
    (SELECT *, 
            rank() over(partition by id order by cancel_date desc) as rank 
     FROM df 
     ORDER BY id, cancel_date DESC) a 
where rank = 1

标签: pythonsqlpandasdatabasedataframe

解决方案


这是您如何实现这一目标的方法。

下面的代码会将cancel_date列转换为datetime对象,因为您想使用以下命令对其进行排序cancel_date

#--if cancel_date is a string, then this code will convert to datetime--

import pandas as pd
df['cancel_date']= pd.to_datetime(df['cancel_date'])

接下来对表进行分组id(这类似于 中的分区SQL),然后使用要按顺序cancel_date排序的列descending。下面的代码将实现相同的效果:

df["Rank"] = df.groupby("id")["cancel_date"].rank(method="first", ascending= False)

最后,过滤 rank 为 1 的数据:

filtered_df = df[df["Rank"] == 1]
filtered_df.head()

推荐阅读