如何使用pandas.groupby()识别并移除完全重复的分组?
如何移除Pandas DataFrame中整组重复的分组
这是个很实用的需求,我来帮你一步步搞定!当你按某列分组后,想要剔除那些除分组键之外,其余列数据完全一致的重复分组,下面结合你的例子给出具体解决方案:
问题重现
先还原你的原始DataFrame:
import pandas as pd data = { 'id': [1,1,1,2,2,2,3,3,3], 'A': [1,2,5,1,2,5,8,4,9], 'B': [2,3,6,2,3,6,9,0,7] } df = pd.DataFrame(data)
原始数据如下:
id A B 0 1 1 2 1 1 2 3 2 1 5 6 3 2 1 2 4 2 2 3 5 2 5 6 6 3 8 9 7 3 4 0 8 3 9 7
我们的目标是移除和分组1(id=1)完全重复的分组2(id=2),仅保留分组1和分组3。
解决方案
核心思路是给每个分组生成唯一的「特征签名」,通过判断签名是否重复来筛选出不重复的分组:
# 1. 按id分组,生成每个分组的特征签名(将A、B列的行转换为元组的元组) group_signatures = df.groupby('id').apply(lambda x: tuple(zip(x['A'], x['B']))) # 2. 找出所有不重复的分组对应的id unique_group_ids = group_signatures[~group_signatures.duplicated()].index # 3. 筛选原始DataFrame中属于唯一分组的行 result_df = df[df['id'].isin(unique_group_ids)]
结果验证
打印处理后的result_df:
print(result_df)
输出正是你想要的结果:
id A B 0 1 1 2 1 1 2 3 2 1 5 6 6 3 8 9 7 3 4 0 8 3 9 7
思路解释
- 生成特征签名:用
tuple(zip(x['A'], x['B']))把每个分组的A、B列数据转换成不可变的元组结构,内容完全一致的分组会生成完全相同的签名。 - 筛选唯一分组:利用
duplicated()标记重复的签名,取反后就能得到所有不重复分组的id。 - 过滤原始数据:用
isin()保留这些唯一分组的所有行,完成整组去重。
内容的提问来源于stack exchange,提问作者FClubb
相关产品推荐
相关产品推荐

