我有一个数据框,显示有关员工、他们所在的站点和他们担任过的职位的详细信息。数据框包含站点 ID、员工 ID 和开始日期(以及许多其他字段)的列。我按站点和员工 ID ASC 排序,然后按生效日期 DESC 排序(最新记录排在第一位)
Site EmployeeID StartDate
1 123 2024-09-01
1 123 2024-08-01
1 123 2024-06-01
1 123 2024-05-01
2 100 2024-06-01
2 100 2024-03-01
我需要创建一个名为的新列,EndDate
它是上一条记录的日期减 1 天。我们正在迁移到一个新系统,所以我们只关心包括 7/1/24(或之后)范围的日期。因此,对于我的示例 df,它看起来像
Site EmployeeID StartDate EndDate Import
1 123 2024-09-01 Y
1 123 2024-08-01 2024-08-31 Y
1 123 2024-06-01 2024-07-31 Y
1 123 2024-05-01 2024-05-31 N
2 100 2024-06-01 Y
2 100 2024-03-01 2024-05-31 N
然后过滤df['Import'] ='Y'
我最初的想法是迭代df.groupby(by=['Site','EmployeeID'])
并使用.iloc[]
它获取下一个日期值,减去 1 天,检查是否EndDate
大于 7/1/24,然后相应地将 Import 设置为Y
或N
。问题是这是一个非常大的数据集(约 300K 行),这个操作会花费很长时间。
将日期转换为日期时间,以便您可以相应地
groupby
进行。["Site", "EmployeeID"]
transform
您可以使用
groupby.shift
,减去 1 天Timedelta
。使用 创建导入列numpy.where
:输出: