基于分组变量C移除Pandas DataFrame中的重复行组问题
基于分组变量去除重复行组的Pandas实现
问题描述
给定如下DataFrame:
import pandas as pd df = pd.DataFrame({'A':[1,2,3,1,2,3,4,1,2,3], 'B':[5,6,7,5,6,7,8,5,6,7], 'C':['x','x','x','y','y','y','y','z','z','z']})
需要按字段C分组,去除行组结构完全重复的分组(示例中x和z的行组完全一致,仅保留其一;y组结构不同,保留),最终输出仅包含x和y组的行。
常规的duplicated()或drop_duplicates()仅能处理单行去重,无法识别组级别的重复,因此需要针对性实现。
解决方案一:组内索引+透视表判断重复组
核心思路是将每个组的结构转换为一维数据,再通过行去重逻辑识别重复组:
- 为每个分组内的行添加组内序号,标记行在组内的位置
df['group_idx'] = df.groupby('C').cumcount()
- 将数据透视为宽表,每个分组对应一行,列包含组内所有位置的
A、B值
pivot_df = df.pivot(index='C', columns='group_idx', values=['A', 'B']) # 合并多级列名(可选,仅为提升可读性) pivot_df.columns = [f'{col[0]}_{col[1]}' for col in pivot_df.columns]
- 筛选出不重复的分组标识
unique_groups = pivot_df[~pivot_df.duplicated(keep='first')].index
- 从原DataFrame中提取目标分组,清理临时列
result = df[df['C'].isin(unique_groups)].drop('group_idx', axis=1)
解决方案二:直接转换组结构为可哈希对象判断重复
更直观的方式是将每个组的(A,B)行转换为元组列表,直接判断列表是否重复:
# 按C分组,将每个组的(A,B)转换为元组列表 group_structures = df.groupby('C').apply(lambda g: list(g[['A','B']].itertuples(index=False, name=None))) # 筛选出首次出现的不重复组 unique_groups = group_structures[~group_structures.duplicated(keep='first')].index # 提取结果 result = df[df['C'].isin(unique_groups)]
结果验证
执行上述代码后,result的输出与期望一致:
A B C 0 1 5 x 1 2 6 x 2 3 7 x 3 1 5 y 4 2 6 y 5 3 7 y 6 4 8 y
内容的提问来源于stack exchange,提问作者HappyPy
相关产品推荐
相关产品推荐

