如何基于两列等价组合筛选唯一行?
原始数据表
| city1 | city2 | dist |
|---|---|---|
| New York | Berlin | 7900 |
| Berlin | New York | 7900 |
| Oregon | Ohio | 5700 |
| Montreal | Rio | 5700 |
| Ohio | Oregon | 5700 |
| Rio | Montreal | 5700 |
| Moscow | Tokyo | 4200 |
| Tokyo | Moscow | 4200 |
解决方案
针对这种城市对互换的重复行,核心思路是统一每对城市的排序规则,让原本互换的行变成完全一致的记录,再进行去重操作。以下是几种常用工具的实现方法:
1. SQL 实现
利用数据库内置函数将两个城市按固定顺序(比如字母序)排列后去重:
-- MySQL/PostgreSQL 版本 SELECT DISTINCT LEAST(city1, city2) AS city_a, GREATEST(city1, city2) AS city_b, dist FROM your_table;
如果是 SQL Server,用 IIF 函数实现排序逻辑:
SELECT DISTINCT IIF(city1 < city2, city1, city2) AS city_a, IIF(city1 > city2, city1, city2) AS city_b, dist FROM your_table;
2. Python Pandas 实现
通过对每行的城市列排序,生成统一格式的城市对后去重:
import pandas as pd import numpy as np # 假设数据已加载到 DataFrame 中 df = pd.DataFrame({ 'city1': ['New York', 'Berlin', 'Oregon', 'Montreal', 'Ohio', 'Rio', 'Moscow', 'Tokyo'], 'city2': ['Berlin', 'New York', 'Ohio', 'Rio', 'Oregon', 'Montreal', 'Tokyo', 'Moscow'], 'dist': [7900, 7900, 5700, 5700, 5700, 5700, 4200, 4200] }) # 对每行的 city1 和 city2 按字母排序,生成新列 df[['city_a', 'city_b']] = pd.DataFrame(np.sort(df[['city1', 'city2']], axis=1), index=df.index) # 基于统一后的城市对和距离去重,删除原列 unique_df = df.drop_duplicates(subset=['city_a', 'city_b', 'dist']).drop(columns=['city1', 'city2']) print(unique_df)
3. Excel 实现
通过辅助列统一城市顺序后删除重复值:
- 添加两个辅助列(比如 D、E 列)
- D 列输入公式:
=IF(A2<B2,A2,B2),下拉填充所有行 - E 列输入公式:
=IF(A2>B2,A2,B2),下拉填充所有行 - 选中 D、E、C(dist)列,点击「数据」→「删除重复值」,仅勾选这三列,确认后即可得到去重结果。
内容的提问来源于stack exchange,提问作者Mojtaba Asgari
相关产品推荐
相关产品推荐

