Pandas分组筛选:基于日期生成EndDate及大数据集高效处理需求
高效处理百万级员工职位数据的日期计算与筛选方案
针对30万行规模的员工职位数据,完全不需要遍历分组数据集,利用Pandas的矢量化操作和**分组移位(shift)**就能实现高效处理,步骤如下:
1. 生成EndDate列
因为数据已经按Site、EmployeeID升序,EffectiveDate降序排序,同一员工同一站点的最新职位排在最前面。我们可以按Site和EmployeeID分组后,将下一条记录的StartDate向上移位,再减去1天作为当前记录的EndDate:
import pandas as pd # 确保StartDate为datetime类型 df['StartDate'] = pd.to_datetime(df['StartDate']) # 分组移位获取下一条记录的StartDate,减1天得到当前记录的EndDate df['EndDate'] = df.groupby(['Site', 'EmployeeID'])['StartDate'].shift(-1) - pd.Timedelta(days=1) # 每组最后一条记录(最新职位)的EndDate可按需设为当前日期或空值 df['EndDate'] = df['EndDate'].fillna(pd.to_datetime('today'))
这里的shift(-1)是将分组内的下一行数据移到当前行,矢量化操作的效率远高于循环遍历,30万行数据几秒就能完成。
2. 生成Import列并筛选数据
需要判断当前职位的时间范围是否覆盖2024-07-01及之后的区间,分两种情况:
- 职位的结束日期(EndDate)>=
2024-07-01 - 职位为当前有效(EndDate为空或为当前日期)且开始日期(StartDate)<=
2024-07-01
用矢量化条件判断生成Import列:
target_date = pd.to_datetime('2024-07-01') # 构建筛选条件 condition = ( (df['EndDate'] >= target_date) | ((df['StartDate'] <= target_date) & df['EndDate'].isna()) ) df['Import'] = condition.map({True: 'Y', False: 'N'}) # 筛选Import为Y的数据 filtered_df = df[df['Import'] == 'Y'].copy()
关键优势
- 完全避免Python层面的循环,所有操作基于Pandas的C底层实现,处理30万行数据的速度比遍历快几十甚至上百倍;
- 代码简洁易维护,符合Pandas惯用写法,后续调试和修改成本低。
内容的提问来源于stack exchange,提问作者Bijan
相关产品推荐
相关产品推荐

