如何在Pandas中按条件移除重复行:col1/col2重复且col3正负配对删除
解决Pandas中按col1/col2分组,仅删除col3互为相反数的第一配对行
解决方案代码
import pandas as pd # 构造示例数据集 data = { 'col1': [1,2,1,3,1,1,1], 'col2': [1,2,1,5,2,2,2], 'col3': [1,2,1,7,-1,1,1] } df = pd.DataFrame(data) def process_group(group): paired_values = set() group['to_drop'] = False for idx in group.index: current_val = group.loc[idx, 'col3'] opposite_val = -current_val if opposite_val in paired_values: # 找到第一个出现相反数的行并标记删除 opposite_idx = group[group['col3'] == opposite_val].index[0] group.loc[[opposite_idx, idx], 'to_drop'] = True # 将两个值加入已配对集合,避免重复处理 paired_values.add(current_val) paired_values.add(opposite_val) elif current_val not in paired_values: paired_values.add(current_val) return group # 按col1和col2分组处理 processed_df = df.groupby(['col1', 'col2'], group_keys=False).apply(process_group) # 过滤掉标记为删除的行,清理辅助列 final_df = processed_df[~processed_df['to_drop']].drop(columns=['to_drop']) print(final_df)
输出结果
col1 col2 col3 0 1 1 1 1 2 2 2 2 1 1 1 3 3 5 7 6 1 2 1
逻辑说明
- 分组遍历:按
col1和col2对数据分组,逐个处理每组内的行。 - 配对跟踪:用集合
paired_values记录已经处理过的数值,避免重复配对。 - 标记删除行:
- 当遇到某个值
current_val时,检查其相反数是否在已配对集合中。 - 若存在,找到第一个出现该相反数的行,同时标记这两行需要删除,并将两个值加入已配对集合。
- 若不存在,将当前值加入集合,等待后续可能的相反数出现。
- 当遇到某个值
- 过滤结果:移除标记为删除的行,得到最终符合要求的数据集。
这个方法仅处理每组内第一对互为相反数的行,不会影响其他相同col3的重复行(如示例中col1=1、col2=1的两行col3=1会全部保留)。
内容的提问来源于stack exchange,提问作者bbaba
相关产品推荐
相关产品推荐

