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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:59:45