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

如何在Pandas DataFrame中标记员工各合同类型的首次雇佣记录?

实现方法

直接用Pandas的分组和序列标记功能就能高效完成需求,步骤如下:

  1. 转换日期格式
    首先把Hire Date列转换成datetime类型,确保日期能正确比较:
import pandas as pd

# 构造示例数据
data = {
    'ID': [10000, 10000, 10000, 10000, 10000, 10000, 10001, 10002, 10002, 10002, 10002],
    'Hire Date': ['2000.01.01', '2001.01.01', '2000.01.01', '2000.01.01', '2002.01.01', '2002.01.01', '1999.03.11', '1989.01.01', '1989.01.01', '1988.01.01', '1999.01.01'],
    'Contract Type': ['Employee', 'Contractor', 'Employee', 'Contractor', 'Employee', 'Employee', 'Employee', 'Employee', 'Contractor', 'Contractor', 'Employee'],
    'Company': ['Abc', 'Zxc', 'Abc', 'Abc', 'Cde', 'Abc', 'Zxc', 'Abc', 'Cde', 'Zxc', 'Abc']
}
df = pd.DataFrame(data)

# 转换日期格式
df['Hire Date'] = pd.to_datetime(df['Hire Date'], format='%Y.%m.%d')
  1. 计算每组最早雇佣日期
    按ID、Contract Type、Company分组,算出每组的最早雇佣日期,生成新列min_hire_date:
df['min_hire_date'] = df.groupby(['ID', 'Contract Type', 'Company'])['Hire Date'].transform('min')
  1. 标记Primary Assignment
    用cumcount()给每组内的行编序号(从0开始),只有日期等于组内最早日期且是组内第一条记录的才标记为Yes,其余为No:
df['Primary Assignment'] = df.groupby(['ID', 'Contract Type', 'Company']).cumcount().eq(0) & df['Hire Date'].eq(df['min_hire_date'])
df['Primary Assignment'] = df['Primary Assignment'].map({True: 'Yes', False: 'No'})
  1. 清理临时列(可选)
    如果不需要min_hire_date列,可以删掉:
df = df.drop('min_hire_date', axis=1)

执行完后得到的结果就和需求示例完全一致,这种方法全程用Pandas内置的向量化操作,效率很高,适合处理大规模数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:10:28