You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按指定列去重,优先保留E列最高值、E相同则保留D列最高值

解决方案

核心思路

通过先按优先级倒序排序、再按分组键去重保留首行的逻辑实现,适配不同规模的数据集。

1. 普通规模数据集(内存可容纳,千万行级以内)

直接用Pandas原生方法实现,性能远高于自定义分组函数的写法:

import pandas as pd

# 示例数据构造,实际使用时替换为你的数据读入逻辑即可
df = pd.DataFrame({
    'A': [3,3,4,4,9],
    'B': [2,2,5,5,3],
    'C': [1,1,6,6,8],
    'D': [4,2,7,9,5],
    'E': [5,3,8,8,4]
})

# 核心处理逻辑
df_result = df.sort_values(by=['E', 'D'], ascending=False) \
              .drop_duplicates(subset=['A', 'B', 'C'], keep='first') \
              .sort_index() # 若不需要保留原始行顺序可删除该行

运行后输出结果完全符合预期:

A  B  C  D  E
0  3  2  1  4  5
3  4  5  6  9  8
4  9  3  8  5  4

2. 超大规模数据集(内存无法容纳,亿行/TB级)

两种适配方案可按需选择:

方案1:用Dask分布式处理

语法和Pandas几乎完全兼容,自动分块处理超大数据:

import dask.dataframe as dd

# 读入大文件,支持csv、parquet等常用格式
ddf = dd.read_csv('your_big_data_file.csv')

# 核心逻辑和Pandas一致
ddf_result = ddf.sort_values(by=['E', 'D'], ascending=False) \
                .drop_duplicates(subset=['A', 'B', 'C'], keep='first')

# 导出结果
ddf_result.to_csv('dedup_result_*.csv', index=False)

方案2:数仓场景直接用SQL处理

如果数据已经存储在数仓/分布式数据库中,直接用SQL执行效率更高,兼容Spark SQL、Hive、普通关系型数据库:

SELECT A,B,C,D,E 
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER(PARTITION BY A,B,C ORDER BY E DESC, D DESC) AS rank_num
    FROM 你的表名
) t
WHERE rank_num = 1

内容的提问来源于stack exchange,提问作者Pauline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 16:27:01