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

基于分组对比多分类值生成递增序号的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_1id_2class_1class_2t_id
01a111
11a111
21a122
32a111
42a122
52a122
62b221
72b112
82b223

版本兼容性说明

代码中使用的groupby.apply、shift()、cumsum()以及布尔逻辑或|均为Pandas 0.22.1支持的方法,无需担心版本适配问题。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:12:18