基于分组对比多分类值生成递增序号的Pandas实现问题
解决方案
核心思路
要实现同时基于class_1和class_2的变化判断,需先对每组内的两列分别与前一行做差异对比,再取逻辑或(任意一列变化即触发序号递增),最后对布尔序列累加生成t_id。
兼容多版本的实现代码
考虑到要兼容Pandas 0.22.1,采用分步骤的分组处理逻辑,避免高版本专属语法:
import pandas as pd # 测试数据集 df = pd.DataFrame({ "id_1": [1, 1, 1, 2, 2, 2, 2, 2, 2], "id_2": ["a", "a", "a", "a", "a", "a", "b", "b", "b"], "class_1": [1, 1, 1, 1, 1, 1, 2, 1, 2], "class_2": [1, 1, 2, 1, 2, 2, 2, 1, 2] }) # 定义分组内的t_id计算逻辑 def calculate_t_id(group): # 分别判断两列与前一行的差异 diff_1 = group['class_1'] != group['class_1'].shift() diff_2 = group['class_2'] != group['class_2'].shift() # 任意一列变化则标记,累加生成t_id group['t_id'] = (diff_1 | diff_2).cumsum() return group # 应用分组计算 df = df.groupby(['id_1', 'id_2'], as_index=False).apply(calculate_t_id) print(df)
预期结果
运行后得到的t_id列符合需求:
| id_1 | id_2 | class_1 | class_2 | t_id | |
|---|---|---|---|---|---|
| 0 | 1 | a | 1 | 1 | 1 |
| 1 | 1 | a | 1 | 1 | 1 |
| 2 | 1 | a | 1 | 2 | 2 |
| 3 | 2 | a | 1 | 1 | 1 |
| 4 | 2 | a | 1 | 2 | 2 |
| 5 | 2 | a | 1 | 2 | 2 |
| 6 | 2 | b | 2 | 2 | 1 |
| 7 | 2 | b | 1 | 1 | 2 |
| 8 | 2 | b | 2 | 2 | 3 |
版本兼容性说明
代码中使用的groupby.apply、shift()、cumsum()以及布尔逻辑或|均为Pandas 0.22.1支持的方法,无需担心版本适配问题。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

