如何在Pandas DataFrame中移除互为颠倒的类似字符串重复项
在Pandas中移除互为颠倒的配对重复项
可以实现这个需求,核心思路是给每个配对生成标准化的唯一键,让互为颠倒的配对拥有相同的键,再基于这个键去重。具体步骤如下:
步骤1:生成标准化配对键
先统一Q0_0列的分隔格式,拆分出配对的两个元素,排序后重新拼接,确保颠倒的配对生成相同的键:
import pandas as pd import numpy as np # 你的原始DataFrame df=pd.DataFrame({ 'Q0_0': ["A vs. Z", "A vs. Bc", "B vs. Z", "B vs Bc", "Bc vs. A", "Bc vs. B", "Z vs. A", "Z vs. B", "C vs. A", "Bc vs. A"], 'Q1_1': [np.random.randint(1,100) for i in range(10)], 'Q1_2': np.random.random(10), 'Q1_3': np.random.randint(2, size=10), 'Q2_1': [np.random.randint(1,100) for i in range(10)], 'Q2_2': np.random.random(10), 'Q2_3': np.random.randint(2, size=10), 'Q3_1': [np.random.randint(1,100) for i in range(10)], 'Q3_2': np.random.random(10), 'Q3_3': np.random.randint(2, size=10), 'Q4_1': [np.random.randint(1,100) for i in range(10)], 'Q4_2': np.random.random(10), 'Q4_3': np.random.randint(2, size=10) }) # 生成标准化配对键 df['pair_key'] = df['Q0_0']\ .str.replace('vs', 'vs.', regex=False) # 统一分隔符为vs. .str.split('vs.', expand=True)\ .apply(lambda x: sorted([x[0].strip(), x[1].strip()]), axis=1) # 拆分后排序元素 .str.join(' vs. ') # 重新拼接成标准化字符串
步骤2:基于键去重并清理临时列
使用drop_duplicates保留每个标准化键的首次出现,最后删除临时的pair_key列:
# 去重,保留首次出现的行 result_df = df.drop_duplicates(subset='pair_key', keep='first').drop(columns='pair_key') # 输出结果 print(result_df)
效果说明
执行后会得到你预期的结果:
- 互为颠倒的配对(如"A vs. Z"和"Z vs. A")会被视为同一组,仅保留第一次出现的行;
- 完全重复的行(如第4、9行的"Bc vs. A")也会被一并移除;
- 无颠倒配对的行(如"C vs. A")会被保留。
内容的提问来源于stack exchange,提问作者Khaled DELLAL
相关产品推荐
相关产品推荐

