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

如何对pandas中涉及两个DataFrame条件判断的行迭代操作向量化?

性能优化方案

原代码逐行遍历df1+每次全表扫描df2匹配区间,时间复杂度为O(N*M)(N为df1行数、M为df2行数),数据量较大时耗时会指数级上升。可使用pandas原生向量化函数merge_asof实现等价逻辑,性能提升可达几十到上百倍。

具体实现步骤如下:

  • 第一步:预处理df1,提前计算时间区间和目标字段,避免循环内重复计算
import pandas as pd
# 若时间列未转成datetime格式,先执行转换
df1['Timestamp'] = pd.to_datetime(df1['Timestamp'])
df2['DateTime'] = pd.to_datetime(df2['DateTime'])

# 预计算时间区间、拼接目标字段
df1_pre = df1.copy()
df1_pre['start_time'] = df1_pre['Timestamp']
df1_pre['end_time'] = df1_pre['Timestamp'] + pd.Timedelta(milliseconds=1000)
df1_pre['TargetAttributePlusStatus'] = df1_pre['EventId'].str.replace(' ', '_') + df1_pre['FehlerStatus'].str.replace(' ', '_')
# merge_asof要求右表按匹配的时间键排序
df1_pre = df1_pre.sort_values('start_time').reset_index(drop=True)
  • 第二步:预处理df2,按时间列排序
# merge_asof要求左表也按匹配的时间列排序
df2_pre = df2.sort_values('DateTime').reset_index(drop=True)
  • 第三步:向量化区间匹配
# 匹配df2.DateTime >= df1.start_time的所有映射
merged = pd.merge_asof(
    df2_pre,
    df1_pre[['start_time', 'end_time', 'TargetAttributePlusStatus']],
    left_on='DateTime',
    right_on='start_time',
    direction='backward' # 匹配小于等于当前df2.DateTime的最大start_time,对应最近的区间起始点
)
# 过滤掉超出区间结束时间的行,和原逻辑输出完全一致
df = merged[merged['DateTime'] <= merged['end_time']].reset_index(drop=True)
# 不需要保留start_time、end_time字段可直接删除
df = df.drop(columns=['start_time', 'end_time'])

补充说明:如果存在df1时间区间重叠,且需要保留所有匹配的区间映射,可使用IntervalIndex方案实现全匹配:

import numpy as np
# 把df1的时间区间转为IntervalIndex
intervals = pd.IntervalIndex.from_arrays(df1_pre['start_time'], df1_pre['end_time'], closed='both')
# 给每个df2的DateTime查找所有匹配的区间索引
matches = df2_pre['DateTime'].apply(lambda x: intervals.get_indexer_for([x])[intervals.get_indexer_for([x])!=-1])
# 展开匹配结果拼接
df = df2_pre.loc[matches.index.repeat(matches.str.len())].reset_index(drop=True)
df['TargetAttributePlusStatus'] = df1_pre['TargetAttributePlusStatus'].loc[np.concatenate(matches.values)].values

内容的提问来源于stack exchange,提问作者Murtaza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:00