如何用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
相关产品推荐
相关产品推荐

