提升Pandas/Python搜索效率求助:员工差旅与工作类型分析优化
优化员工差旅-工作类型统计代码方案
原代码的核心问题是逐行循环+多次全表扫描,时间复杂度为O(N*M)(N为df1行数,M为df2行数),导致效率极低。以下是基于Pandas向量化操作的优化方案,可将处理时间从小时级压缩到分钟级:
优化步骤
1. 为差旅记录添加唯一标识
新增TripID列标记每条差旅记录,方便后续统计结果匹配回原表:
df1['TripID'] = df1.index
2. 批量匹配差旅与工作记录
通过merge按员工ID合并两张表,再批量筛选出差旅期间的工作记录,替代逐行循环筛选:
# 按EmployeeID合并两张表,得到同一员工的所有差旅+工作记录组合 merged = df1.merge(df2, on='EmployeeID', how='left') # 批量筛选符合差旅时间范围的工作记录 filtered = merged[(merged['Work_Date'] >= merged['Start_Date']) & (merged['Work_Date'] <= merged['End_Date'])]
3. 统计各差旅的工作类型数量
使用pivot_table一次性统计每条差旅对应的各类工作记录数,替代内层循环:
# 按TripID分组,统计每个差旅的各Work_type数量 type_counts = filtered.pivot_table( index='TripID', columns='Work_type', values='EmployeeID', aggfunc='count', fill_value=0 )
4. 将统计结果合并回原差旅表
把统计好的工作类型数量匹配到原df1中:
# 合并统计结果,空值补0 df1 = df1.merge(type_counts, on='TripID', how='left').fillna(0) # 移除临时标识列 df1 = df1.drop('TripID', axis=1)
额外性能优化(可选)
如果df2的Work_Date是有序的,使用merge_asof可进一步降低内存占用、提升速度:
# 先按员工ID+日期排序两张表 df1_sorted = df1.sort_values(['EmployeeID', 'Start_Date']) df2_sorted = df2.sort_values(['EmployeeID', 'Work_Date']) # 匹配同一员工下Work_Date >= Start_Date的记录,再筛选<=End_Date的范围 merged_asof = pd.merge_asof( df1_sorted, df2_sorted, on='Work_Date', by='EmployeeID', direction='forward' ) filtered_asof = merged_asof[merged_asof['Work_Date'] <= merged_asof['End_Date']] # 后续统计步骤同上
优化原理
原代码每次循环都要全表扫描df2筛选员工和日期,优化后的方案利用Pandas底层C实现的向量化操作,将多次零散筛选合并为一次批量处理,时间复杂度大幅降低,同时避免了循环带来的额外开销。
内容的提问来源于stack exchange,提问作者colgraff2008
相关产品推荐
相关产品推荐

