You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分组变量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()仅能处理单行去重,无法识别组级别的重复,因此需要针对性实现。


解决方案一:组内索引+透视表判断重复组

核心思路是将每个组的结构转换为一维数据,再通过行去重逻辑识别重复组:

  1. 为每个分组内的行添加组内序号,标记行在组内的位置
df['group_idx'] = df.groupby('C').cumcount()
  1. 将数据透视为宽表,每个分组对应一行,列包含组内所有位置的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]
  1. 筛选出不重复的分组标识
unique_groups = pivot_df[~pivot_df.duplicated(keep='first')].index
  1. 从原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:50:22