如何按Sub_category分组Pandas DataFrame并按优先级整理Item列
Pandas分组合并需求及解决方案
原始数据
| Sub_category | Category 1 | Category 2 | Category 3 |
|---|---|---|---|
| A | Item1 | ||
| A | Item1 | ||
| A | Item2 | ||
| B | Item3 | ||
| B | Item3 | ||
| C | Item4 | Item4 | |
| C | Item5 |
预期输出
要求按Sub_category分组,每个分组仅保留1条记录;同一Sub_category下的Item若出现在多列中,遵循Category 2 > Category 3 > Category 1的优先级保留到对应列,最终结果如下:
| Sub_category | Category 1 | Category 2 | Category 3 |
|---|---|---|---|
| A | Item1 | Item2 | |
| B | Item3 | ||
| C | Item4 | Item5 |
解决方案代码
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)
代码说明
- 按
Sub_category分组后,对每个分组单独处理 - 遵循优先级顺序优先保留高列的Item,低优先级列仅收录未被高优先级列覆盖的Item
- 自动去重同一列下的重复Item,确保每个Item仅出现在优先级最高的对应列中
- 最终输出每个
Sub_category对应一条记录的结果表
内容的提问来源于stack exchange,提问作者chan-98
相关产品推荐
相关产品推荐

