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

如何按Sub_category分组Pandas DataFrame并按优先级整理Item列

Pandas分组合并需求及解决方案

原始数据

Sub_categoryCategory 1Category 2Category 3
AItem1
AItem1
AItem2
BItem3
BItem3
CItem4Item4
CItem5

预期输出

要求按Sub_category分组,每个分组仅保留1条记录;同一Sub_category下的Item若出现在多列中,遵循Category 2 > Category 3 > Category 1的优先级保留到对应列,最终结果如下:

Sub_categoryCategory 1Category 2Category 3
AItem1Item2
BItem3
CItem4Item5

解决方案代码

import pandas as pd

# 示例原始数据(实际可替换为你的数据源读取逻辑)
df = pd.DataFrame([
    ['A', 'Item1', '', ''],
    ['A', '', 'Item1', ''],
    ['A', '', '', 'Item2'],
    ['B', 'Item3', '', ''],
    ['B', '', 'Item3', ''],
    ['C', 'Item4', 'Item4', ''],
    ['C', '', '', 'Item5']
], columns=['Sub_category', 'Category 1', 'Category 2', 'Category 3'])

def process_group(group):
    result = {'Sub_category': group['Sub_category'].iloc[0]}
    # 按优先级从高到低排列列
    priority_cols = ['Category 2', 'Category 3', 'Category 1']
    processed_items = set()
    
    for col in priority_cols:
        # 提取当前列非空且未被处理过的Item
        valid_items = group[col].replace('', pd.NA).dropna().unique()
        valid_items = [item for item in valid_items if item not in processed_items]
        result[col] = ', '.join(valid_items) if valid_items else ''
        processed_items.update(valid_items)
    
    # 补全未处理的列
    for col in df.columns:
        if col not in result:
            result[col] = ''
    
    return pd.Series(result)

# 分组处理并生成最终结果
final_df = df.groupby('Sub_category').apply(process_group).reset_index(drop=True)

print(final_df)

代码说明

  1. 按Sub_category分组后,对每个分组单独处理
  2. 遵循优先级顺序优先保留高列的Item,低优先级列仅收录未被高优先级列覆盖的Item
  3. 自动去重同一列下的重复Item,确保每个Item仅出现在优先级最高的对应列中
  4. 最终输出每个Sub_category对应一条记录的结果表

内容的提问来源于stack exchange,提问作者chan-98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:45:49