Python 3.7下Pandas去除含逆序键对的重复数据问题
解决DataFrame中逆序键对的重复项去除问题
问题背景
你需要处理包含Key1和Key2的DataFrame,将逆序键对(比如(1,2)和(2,1))视为重复项并去除,只保留其中一条记录。原始数据如下:
Key1 Key2 Value1 Info1 Info2 Info3 ... 1 2 5.5 255 232 2 1 4.9 200 200 1 3 1 2.2 100 100 5
期望得到的结果是保留(1,2)和(1,3)的记录,去除(2,1)的重复项。
错误原因分析
你之前尝试的代码:
cols = ['Key1','Key2'] df[cols] = df[cols].apply(sorted, axis=1) df = df.drop_duplicates(subset=cols)
出现ValueError: Must have equal len keys and value when setting with an iterable的原因是:df[cols].apply(sorted, axis=1)返回的是一个每个元素为列表的Series,而直接将这个Series赋值给df[cols](两列)时,DataFrame无法将列表拆分到对应的列中,导致长度不匹配。
解决方案
这里提供两种高效的解决方法,按需选择:
方法1:使用Numpy排序(推荐,适合大数据集)
Numpy的sort函数可以直接对列进行行维度排序,返回的二维数组可以直接赋值给DataFrame的列,不会报错:
import numpy as np import pandas as pd # 假设你的DataFrame是df cols = ['Key1', 'Key2'] # 对Key1和Key2列按行排序 sorted_keys = np.sort(df[cols], axis=1) # 将排序后的值替换原列 df[cols] = sorted_keys # 基于排序后的键去重 df = df.drop_duplicates(subset=cols)
处理后你会得到期望的结果:(1,2)和(1,3)的记录被保留,(2,1)因排序后和(1,2)重复被去除。
方法2:保留原始键顺序的去重
如果你不想修改原始的Key1和Key2值,只是基于逆序键对去重,可以创建一个临时的排序键列:
cols = ['Key1', 'Key2'] # 生成排序后的键元组作为临时列 df['sorted_key_pair'] = df[cols].apply(lambda x: tuple(sorted(x)), axis=1) # 保留每个排序键对应的第一行记录 df = df.drop_duplicates(subset='sorted_key_pair') # 删除临时列 df = df.drop(columns='sorted_key_pair')
这种方法会保留第一次出现的键对(比如原始数据中的(1,2)),去除后续出现的逆序重复项((2,1)),同时不会改变原始Key1和Key2的顺序。
验证结果
无论使用哪种方法,最终的DataFrame都会符合你的期望:
Key1 Key2 Value1 Info1 Info2 Info3 ... 1 2 5.5 255 232 1 3 1 2.2 100 100 5
内容的提问来源于stack exchange,提问作者Gesetzt
相关产品推荐
相关产品推荐

