Pandas实现按国家代码/产品ID分组保留唯一垂直组行
按组合维度去重的Pandas实现方案
原始数据
import pandas as pd df = pd.DataFrame({ 'COUNTRY_CODE': ['CO','CO','CO','BR','BR','BR'], 'VERTICAL_GROUP_ID': [2,2,3,2,3,3], 'SUB_VERTICAL': ['SUPER','SUPER','HOME','LICOR','SPORTS','HOME'], 'PRODUCT_ID': [1111,1111,1111,1111,1111,2222], 'SHOWN': [7,8,12,14,16,1], })
需求说明
对每个COUNTRY_CODE/PRODUCT_ID组合,每个VERTICAL_GROUP_ID仅保留任意一行,预期结果如下:
| COUNTRY_CODE | VERTICAL_GROUP_ID | SUB_VERTICAL | PRODUCT_ID | SHOWN |
|---|---|---|---|---|
| CO | 2 | SUPER | 1111 | 7 |
| CO | 3 | HOME | 1111 | 12 |
| BR | 2 | LICOR | 1111 | 14 |
| BR | 3 | SPORTS | 1111 | 16 |
| BR | 3 | HOME | 2222 | 1 |
问题场景
尝试使用groupby("PRODUCT_ID").drop_duplicates(subset=['VERTICAL_GROUP_ID'])时触发错误:
AttributeError: 'DataFrameGroupBy' object has no attribute 'drop_duplicates'
最优解决方法
无需使用groupby,直接通过drop_duplicates指定完整的去重维度即可:
# 按COUNTRY_CODE、PRODUCT_ID、VERTICAL_GROUP_ID组合去重,保留每组第一行 result_df = df.drop_duplicates(subset=['COUNTRY_CODE', 'PRODUCT_ID', 'VERTICAL_GROUP_ID'])
补充说明
drop_duplicates默认保留每组重复项的第一行,满足“任意保留一行”的需求- 若需要保留每组最后一行,可添加参数
keep='last' - 该方法直接在原DataFrame上处理去重逻辑,性能优于先分组再处理的方式
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

