Python DataFrame含列表列时排除指定列保留首行去重实现方法
实现思路
核心是解决两个痛点:列表不可哈希、列表元素顺序不影响重复判定,具体步骤如下:
- 构造可哈希的临时判断列:对
THREE列的每个列表元素先排序,再转为元组,既消除了元素顺序的影响,又满足drop_duplicates对可哈希类型的要求 - 去重判断子集指定为
ONE列 + 临时列,相当于排除TWO列参与重复判定,保留默认的keep='first'规则保留首次出现的条目 - 去重完成后删除临时列即可得到结果
代码实现
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ONE': ['A', 'A', 'B', 'B', 'C', 'C', 'C', 'C'], 'TWO': ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'C3', 'C4'], 'THREE': [ ['1','2','3'], ['3','2','1'], ['1','2'], ['1','2','3'], ['1','2','3'], ['3','2','1'], ['1','2'], ['2','1'] ] }) # 生成临时哈希列,消除THREE列元素顺序影响 df['tmp_hash'] = df['THREE'].apply(lambda x: tuple(sorted(x))) # 按指定列去重后删除临时列 df_result = df.drop_duplicates(subset=['ONE', 'tmp_hash']).drop(columns='tmp_hash') print(df_result)
输出结果
ONE TWO THREE 0 A A1 ['1', '2', '3'] 2 B B1 ['1', '2'] 3 B B2 ['1', '2', '3'] 4 C C1 ['1', '2', '3'] 6 C C3 ['1', '2']
(注:索引和示例预期的差异是因为示例索引从1开始,Python默认索引从0开始,可自行调整索引显示规则)
方案说明
如果THREE列存在重复元素的场景(比如['1','1','2']和['1','2','1']),排序转元组的方案也能正确识别为重复,相比用frozenset转换的方案不会出现重复元素被误判的问题,适用性更广。
内容的提问来源于stack exchange,提问作者WhiteHatMan
相关产品推荐
相关产品推荐

