如何在Pandas DataFrame中标记员工各合同类型的首次雇佣记录?
实现方法
直接用Pandas的分组和序列标记功能就能高效完成需求,步骤如下:
- 转换日期格式
首先把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')
- 计算每组最早雇佣日期
按ID、Contract Type、Company分组,算出每组的最早雇佣日期,生成新列min_hire_date:
df['min_hire_date'] = df.groupby(['ID', 'Contract Type', 'Company'])['Hire Date'].transform('min')
- 标记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'})
- 清理临时列(可选)
如果不需要min_hire_date列,可以删掉:
df = df.drop('min_hire_date', axis=1)
执行完后得到的结果就和需求示例完全一致,这种方法全程用Pandas内置的向量化操作,效率很高,适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

