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

如何在大型日期索引DataFrame中按月追踪员工薪资与职位变动

高效实现员工月度变动追踪方案

针对你的大型时间序列员工数据集,无需按月切片合并,直接用pandas的分组移位方法就能高效生成变动标识,步骤如下:

1. 预处理数据(确保时间排序正确)

首先确保日期列是datetime类型,并按员工ID和日期排序,保证移位操作能准确获取上月数据:

import pandas as pd
import numpy as np

# 转换日期列格式(如果还不是datetime类型)
df['DATE'] = pd.to_datetime(df['DATE'])
# 按员工ID和日期排序
df = df.sort_values(['USER_ID', 'DATE'])

2. 分组获取上月数据

通过groupby('USER_ID')按员工分组,用shift(1)获取每个员工上月的职位和薪资:

# 生成上月职位、薪资临时列
df['prev_position'] = df.groupby('USER_ID')['POSITION_ID'].shift(1)
df['prev_salary'] = df.groupby('USER_ID')['SALARY'].shift(1)

3. 条件判断生成变动标识

用np.select批量判断每一行的变动类型,逻辑完全匹配你的需求:

# 定义判断条件
conditions = [
    # 无上月数据(员工首次出现的记录)
    df['prev_position'].isna(),
    # 职位变动且薪资上涨 → 晋升
    (df['POSITION_ID'] != df['prev_position']) & (df['SALARY'] > df['prev_salary']),
    # 职位不变但薪资上涨 → 涨薪
    (df['POSITION_ID'] == df['prev_position']) & (df['SALARY'] > df['prev_salary']),
    # 其他所有情况(薪资不变、下降、职位变动但薪资未涨等)
    True
]

# 对应变动标识
values = ['NONE', 'PROMOTION', 'RAISE', 'NONE']

# 生成目标列
df['EMPLOYEE_MOVEMENT'] = np.select(conditions, values)

4. 清理临时列(可选)

如果不需要临时的上月数据列,可以直接删除:

df = df.drop(['prev_position', 'prev_salary'], axis=1)

方案优势

  • 全程无需按月切片合并,避免了重复的数据集拼接操作,时间复杂度为O(n),处理三年的大型数据集效率极高
  • 逻辑清晰,所有判断基于员工自身的历史数据,不会出现跨员工的匹配错误
  • 代码可扩展性强,如果后续需要新增变动类型(比如降职、降薪),只需添加对应的条件和值即可

内容的提问来源于stack exchange,提问作者Abisai Pérez Zamarripa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:36:24