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

Pandas实现DataFrame两列无序组合的唯一行保留(含第三列)

解决三列DataFrame按前两列无序组合去重问题

问题背景

需要对包含三列的DataFrame去重:其中col1和col2的无序组合(如A,B与B,A)对应的col3值始终相同,目标是保留每组无序组合的其中一行。

常见错误原因与解决方案

1. 解决TypeError: '<' not supported between instances of 'float' and 'str'

原代码np.sort(df.to_numpy(), axis=1).sum(1)报错,是因为把col3的数值型数据和col1/col2的字符串型数据混在一起排序,两种类型无法比较。正确做法是只提取col1和col2列进行处理:

import pandas as pd
import numpy as np

# 示例数据
df = pd.DataFrame({
    'col1': ['A', 'B'],
    'col2': ['B', 'A'],
    'col3': [5, 5]
})

# 仅对col1和col2列排序生成key
df['key'] = np.sort(df[['col1', 'col2']].to_numpy(), axis=1).sum(axis=1)
# 按key去重,保留首次出现的行
df_unique = df.drop_duplicates(subset='key', keep='first').drop(columns='key')

2. 解决KeyError: ('col1', 'col2')

原代码network['col1', 'col2']错误,pandas中提取多列需要用双层方括号[['col1', 'col2']],单层方括号会将('col1','col2')视为单个列名查找,导致KeyError。上面的代码已经修正了这个问题。

3. 解决A value is trying to be set on a copy of a slice from a DataFrame警告

这个警告是因为你的DataFrame可能是另一个DataFrame的切片副本,pandas无法确定你要修改的是副本还是原数据。可以通过两种方式解决:

  • 提前创建DataFrame副本:
df_copy = df.copy()
df_copy['key'] = np.minimum(df_copy['col1'], df_copy['col2']) + np.maximum(df_copy['col1'], df_copy['col2'])
df_unique = df_copy.drop_duplicates(subset='key', keep='first').drop(columns='key')
  • 使用.loc明确操作原DataFrame:
df.loc[:, 'key'] = np.minimum(df['col1'], df['col2']) + np.maximum(df['col1'], df['col2'])
df_unique = df.drop_duplicates(subset='key', keep='first').drop(columns='key')

替代方案:用apply生成有序元组作为key

如果担心numpy排序的类型兼容问题,可以用apply对每行生成有序元组作为key(元组可作为去重依据,列表不行):

df['key'] = df.apply(lambda row: tuple(sorted([row['col1'], row['col2']])), axis=1)
df_unique = df.drop_duplicates(subset='key', keep='first').drop(columns='key')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:26:28