如何在Pandas中按material_id分组,保留指定列唯一值并列出plant_id
解决方案:分组后同时实现指定列去重与列转列表
直接通过groupby.agg()为不同列指定对应的聚合逻辑,就能同时满足你的两个需求:
def search_output(materials): df = pd.DataFrame(materials) # 过滤掉@search.score列,分组后为各列指定聚合规则 df_ref = df.loc[:, df.columns != '@search.score'].groupby('material_id').agg( material_description=('material_description', 'unique'), MPN=('MPN', 'unique'), plant_id=('plant_id', list) ) # 可选:将unique返回的numpy数组转为Python列表,统一格式 df_ref['material_description'] = df_ref['material_description'].apply(list) df_ref['MPN'] = df_ref['MPN'].apply(list) return df_ref
代码说明:
- 用
agg()的关键字参数写法,明确指定每一列的处理方式:material_description和MPN列用unique聚合,自动保留该分组下的唯一值plant_id列用list聚合,直接将分组内的所有值转为列表
- 额外的
apply(list)是因为unique()返回的是numpy数组,转成Python列表能和plant_id的格式保持一致,方便后续业务处理 - 提前通过
loc过滤掉不需要的@search.score列,避免干扰分组逻辑
对比原代码的改进:
- 原第一段代码用统一的
lambda x: list(x),会保留所有重复值,无法实现指定列去重 - 原第二段代码只处理了两个去重列,遗漏了
plant_id转列表的需求 - 本方案精准控制每列的聚合逻辑,一次完成所有需求
内容的提问来源于stack exchange,提问作者Tossibob
相关产品推荐
相关产品推荐

