Pandas:如何基于GroupBy创建新索引,实现分组表格转换?
解决方案:将表1转换为带分组索引的表2
完全可以实现表1到表2的转换,而且不需要必须显式使用groupby语句,但split-apply-combine正是实现这类分组计数需求的核心思路,Pandas的groupby方法本身就是对该模式的封装。以下是具体实现步骤:
核心逻辑说明
- 保留全局索引:原表的行号直接对应表2中的
global_index,提取即可。 - 生成分组内独立索引:针对
class_section分组,给每个组内的行分配从0开始的自增序号,即group_index。 - 调整排序与列顺序:按
class_section分组排序,再调整列的排列顺序匹配表2结构。
代码实现
假设原表数据存储在Pandas DataFrame df中:
import pandas as pd # 构造表1对应的DataFrame data = { 'name': ['Morris', 'Gertie', 'Kristal', 'Roslyn', 'Tari', 'Dewayne', 'Edward', 'Frank'], 'movie_watch_count': [2, 3, 3, 4, 7, 1, 6, 0], 'class_section': [2, 1, 1, 2, 2, 1, 2, 2] } df = pd.DataFrame(data) # 1. 添加global_index列(直接使用原表行号) df['global_index'] = df.index # 2. 生成group_index:按class_section分组后累计计数(split-apply-combine的典型应用) df['group_index'] = df.groupby('class_section').cumcount() # 3. 按class_section排序,调整列顺序匹配表2 result = df.sort_values('class_section')[['global_index', 'group_index', 'name', 'movie_watch_count', 'class_section']].reset_index(drop=True) print(result)
输出结果验证
运行后得到的result完全匹配表2结构:
| global_index | group_index | name | movie_watch_count | class_section | |
|---|---|---|---|---|---|
| 0 | 1 | 0 | Gertie | 3 | 1 |
| 1 | 2 | 1 | Kristal | 3 | 1 |
| 2 | 5 | 2 | Dewayne | 1 | 1 |
| 3 | 0 | 0 | Morris | 2 | 2 |
| 4 | 3 | 1 | Roslyn | 4 | 2 |
| 5 | 4 | 2 | Tari | 7 | 2 |
| 6 | 6 | 3 | Edward | 6 | 2 |
| 7 | 7 | 4 | Frank | 0 | 2 |
关于实现方式的补充说明
- split-apply-combine的本质:
df.groupby('class_section').cumcount()就是split(按class_section拆分数据)→ apply(对每个组执行累计计数)→ combine(将结果合并回原表)的过程,完全符合你提到的split-apply-combine技术。 - 是否必须用groupby:不是必须,但
groupby是最简洁高效的实现方式。如果不用groupby,可以手动拆分每个组、单独计数再合并,但代码会冗余且效率更低,没有必要舍近求远。
内容的提问来源于stack exchange,提问作者Larijohn Adorable
相关产品推荐
相关产品推荐

