如何将DataFrame分组后的多行Category转置为多列?
问题描述
我有如下DataFrame:
| ID1 | ID2 | Category |
|---|---|---|
| A | 01 | OCC |
| A | 01 | HUI |
| A | 01 | IAC |
| A | 03 | OCC |
| B | 05 | OCC |
| B | 05 | HUI |
| C | 08 | IAC |
希望以ID1和ID2为分组依据,将Category列转置为多列,列数取分组中Category的最大数量(示例中为3列),填充对应值,不足的列留空,得到如下结果:
| ID1 | ID2 | Category1 | Category2 | Category3 |
|---|---|---|---|---|
| A | 01 | OCC | HUI | IAC |
| A | 03 | OCC | ||
| B | 05 | OCC | HUI | |
| C | 08 | IAC |
实现方法
可以通过Pandas的分组标记序号+透视转置来实现,具体步骤如下:
- 添加组内序号:按
ID1和ID2分组后,给每个组内的Category标记从1开始的序号,为后续转置列做准备。 - 透视转置:以
ID1、ID2为索引,序号为列,Category为值进行透视,自动生成对应数量的列。 - 重命名列:将序号列重命名为
Category1、Category2的格式。 - 填充空值:将转置后缺失的位置填充为空字符串,重置索引恢复正常结构。
代码实现
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'ID1': ['A', 'A', 'A', 'A', 'B', 'B', 'C'], 'ID2': ['01', '01', '01', '03', '05', '05', '08'], 'Category': ['OCC', 'HUI', 'IAC', 'OCC', 'OCC', 'HUI', 'IAC'] }) # 给每个分组内的Category添加从1开始的序号 df['seq'] = df.groupby(['ID1', 'ID2']).cumcount() + 1 # 透视转置,生成多列 pivot_df = df.pivot(index=['ID1', 'ID2'], columns='seq', values='Category') # 重命名列名 pivot_df.columns = [f'Category{col}' for col in pivot_df.columns] # 重置索引并填充空值 result = pivot_df.reset_index().fillna('') print(result)
输出结果
运行代码后得到的结果与目标完全一致:
| ID1 | ID2 | Category1 | Category2 | Category3 |
|---|---|---|---|---|
| A | 01 | OCC | HUI | IAC |
| A | 03 | OCC | ||
| B | 05 | OCC | HUI | |
| C | 08 | IAC |
内容的提问来源于stack exchange,提问作者hhp
相关产品推荐
相关产品推荐

