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

如何在Pandas中为每个分组添加职位变更标志列

解决方案:添加职位变更标志列

嗨,这个需求我之前处理过不少次,用Pandas的分组移位对比就能轻松实现,直接上可运行的完整代码:

import pandas as pd

# 创建原始DataFrame
df = pd.DataFrame({
    "id": [1, 1, 1, 2, 2, 2, 3, 3, 3],
    "company": ["A", "A", "B", "C", "C", "C", "D", "E", "F"]
}, columns=["id", "company"])

# 生成职位变更标志列
df['job_change'] = (df['company'] != df.groupby('id')['company'].shift()).fillna(0).astype(int)

# 输出结果
print(df)

运行后会得到你想要的结果:

id company  job_change
0   1      A           0
1   1      A           0
2   1      B           1
3   2      C           0
4   2      C           0
5   2      C           0
6   3      D           0
7   3      E           1
8   3      F           1

代码分步解释

我拆解开每一步帮你理解:

  • 分组移位:df.groupby('id')['company'].shift() 会按id分组后,把每个组内的company列向下偏移一行。比如id=1的组,移位后第一行是NaN(没有上一行数据),第二行是A,第三行是A。
  • 对比判断:df['company'] != 移位结果 会逐行比较当前公司和上一行是否不同,得到布尔值(True表示变更,False表示未变更),第一行因为移位后是NaN,结果会是NaN。
  • 填充缺失值:.fillna(0) 把每个组第一行的NaN替换为0(毕竟第一个记录没有上一个职位,自然不算变更)。
  • 类型转换:.astype(int) 把布尔值转换成整数(True→1,False→0),符合你需要的标志格式。

为什么不用diff()?

你提到Stack Overflow上关于groupby结合diff的讲解少,其实是因为diff()主要针对数值类型计算差值,对于字符串这类非数值类型并不适用——强行用的话会报错,所以移位对比才是更通用的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:22:40