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

