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

使用Pandas GroupBy去重时仅保留Type='B'行最后项的问题

Pandas分组条件去重错误排查与修正

问题场景

需要实现的逻辑:

  • 以Type列的'A'为分组起点,到下一个'A'前为一组
  • 仅对每组中Type='B'的行,按Key列去重并保留最后出现的
  • 其他类型(如'D')的重复行需保留

原代码运行后,Type='D'的重复行被错误删除,不符合预期。

原代码问题分析

原代码中groupby后的apply逻辑存在缺陷:只要组内存在Type='B'的行,就对整个组执行drop_duplicates操作,这会导致组内其他类型(比如最后一组的'D')的重复行也被误删,违背了需求。

修正方案

调整处理逻辑:仅对每组内Type='B'的子集执行去重,其他行直接保留,最后将两部分合并后返回,确保非B类型的重复行不受影响。

修正后的代码如下:

import pandas as pd
data = {
    'Type': ['A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C','D','D'],
    'Key': ['ZPOC', 'adr#', 'name#', 'city#', 'adr#', 'city#', 'city#', 'ZZRE', 'ZPOC', 'adr#', 'name#', 'city#', 'adr#', 'city#', 'city#', 'ZZRE','item','item']
}
df = pd.DataFrame(data)

# 创建Type为'A'的掩码,生成分组列
mask_a = df['Type'] == 'A'
df['Group'] = mask_a.cumsum()

# 分组处理:仅对Type='B'的行去重,其他行保留
def process_group(group):
    # 分离B行和非B行
    b_rows = group[group['Type'] == 'B']
    non_b_rows = group[group['Type'] != 'B']
    # 对B行按Key去重,保留最后一条
    b_deduped = b_rows.drop_duplicates(subset='Key', keep='last')
    # 合并并恢复原顺序
    return pd.concat([non_b_rows, b_deduped]).sort_index()

df = df.groupby('Group').apply(process_group)
df.drop('Group', axis=1, inplace=True)
print(df)

验证结果

运行修正后的代码,最后一组的两行Type='D'、Key='item'会被完整保留,同时每组内的Type='B'行按Key去重并保留最后出现的,完全符合预期需求。

内容的提问来源于stack exchange,提问作者educational board

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:37:22