Python - 删除重复项,但仅在满足其他条件时

数据挖掘 熊猫
2022-02-17 22:03:36

我试图在 Python 中找到一种方法来删除特定列中出现重复的行,但只删除那些不属于最新日期的重复项。

在下面的示例中,我想删除“CODE”和“BC”匹配的行,但前提是它们不是最近的日期。如果 'CODE' 和 'BC' 匹配并且两者具有相同的日期,则将删除具有最低 'ID' 编号的行。

代码 公元前 日期 ID
12345 567 2017 年 1 月 1 日 111
12345 567 2017 年 1 月 1 日 111
12345 567 2018 年 10 月 1 日 555
12345 567 2018 年 10 月 1 日 555
12345 789 2017 年 3 月 16 日 777
12345 789 2021 年 9 月 17 日 888
23456 354 2020 年 10 月 21 日 333
23456 354 2020 年 10 月 21 日 444

理想结果:

代码 公元前 日期 ID
12345 567 2018 年 10 月 1 日 555
12345 567 2018 年 10 月 1 日 555
12345 789 2021 年 9 月 17 日 888
23456 354 2020 年 10 月 21 日 444

谢谢

1个回答

我认为以下应该做你正在寻找的。它首先根据 CODE 和 BC 列计算行数,以检查是否重复。此外,它会检查 ID 是否等于组中的最高 ID(而不是查看最新日期,因为这将为 BC 354 提供额外的行)。然后可以过滤数据框以仅选择您要查找的行(和列)。

(
    df
    .assign(
        count = lambda x: x.groupby(["CODE", "BC"])["ID"].transform("count"),
        id_max = lambda x: x["ID"] == x.groupby(["CODE", "BC"])["ID"].transform("max")
    )
    .loc[lambda x: (x["count"] == 1) | (x["id_max"]), ["CODE", "BC", "DATE", "ID"]]
)
代码 公元前 日期 ID
12345 567 2018 年 10 月 1 日 555
12345 567 2018 年 10 月 1 日 555
12345 789 2021 年 9 月 17 日 888
23456 354 2020 年 10 月 21 日 444