Pandas Dataframe:删除重复行,忽略一个特定列

zkure5ic  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个这样的dataframe:
| IDX|一个|B级|C类|修改日期|
| - -----|- -----|- -----|- -----|- -----|
| 0| 1| 2| 3| 2022 - 06 - 30 - 2022 - 2023 - 2023 - 2023 - 2024 - 2025 - 2025 - 2025 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026|
| 1| 1| 2| 3| 2022 - 06 - 30 - 2022 - 2023 - 2023 - 2023 - 2024 - 2025 - 2025 - 2025 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026|
| 2| 1| 2| 4| 2022 - 06 - 30 - 2022 - 2023 - 2023 - 2023 - 2024 - 2025 - 2025 - 2025 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026|
| 3| 1| 2| 3| 2022 - 07 - 10|
我想删除A/B/C列的重复行,但不删除modified date列的重复行。如果重复的行在modified date中具有不同的值,则在modified date中保留较大的值。
结果应该是这样的:
| IDX|一个|B级|C类|修改日期|
| - -----|- -----|- -----|- -----|- -----|
| 2| 1| 2| 4| 2022 - 06 - 30 - 2022 - 2023 - 2023 - 2023 - 2024 - 2025 - 2025 - 2025 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026 - 2026|
| 3| 1| 2| 3| 2022 - 07 - 10|
它会删除索引为0和1的行,因为它们的值与索引为3的值相同,但它们在modified date中的值较小。

    • 注意:在我的真实案例中,有大约30列用于检查重复数据。此外,在我的实际情况中,检查重复时需要忽略两列。我只是使用列A/B/C/modified date来简化问题。**

使用df.drop_duplicates()是不够的。
如何做到这一点?

bkhjykvo

bkhjykvo1#

基于更新的评论:
听起来像是您想要每组具有最大modified date的行。
这可以用.groupby() + .idxmax()来实现:

data = {
   'idx': {0: 0, 1: 1, 2: 2, 3: 3},
   'A': {0: 1, 1: 1, 2: 1, 3: 1},
   'B': {0: 2, 1: 2, 2: 2, 3: 2},
   'C': {0: 3, 1: 3, 2: 4, 3: 3},
   'modified date': {
      0: pd.Timestamp('2022-06-30 00:00:00'),
      1: pd.Timestamp('2022-06-30 00:00:00'),
      2: pd.Timestamp('2022-06-30 00:00:00'),
      3: pd.Timestamp('2022-07-10 00:00:00'),
   },
   'D': {0: 4, 1: 3, 2: 2, 3: 1},
}

df = pd.DataFrame(data)

df.loc[df.groupby(['A', 'B', 'C'])['modified date'].idxmax()]
idx  A  B  C modified date  D
3    3  1  2  3    2022-07-10  1
2    2  1  2  4    2022-06-30  2

看起来你想传递subset=keep=(假设日期是排序的)

df.drop_duplicates(subset=['A', 'B', 'C'], keep='last')
idx  A  B  C modified date
2    2  1  2  4    2022-06-30
3    3  1  2  3    2022-07-10

相关问题