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

提升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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:17:34