如何高效过滤Pandas数据框:排除另一数据框日期区间内的行
百万级数据高效处理方案:排除指定Code日期区间内的行
核心思路
放弃apply逐行循环,改用Pandas向量化操作+合并匹配,依托底层优化的C实现提升性能,彻底规避逐行遍历的低效问题。
步骤与代码实现
- 统一日期类型
先确保所有日期列都是datetime类型,否则无法进行有效比较:
import pandas as pd # 转换df_table的时间戳列 df_table['Timestamp'] = pd.to_datetime(df_table['Timestamp']) # 转换df_dates的区间列(假设列名为start_date、end_date) df_dates[['start_date', 'end_date']] = df_dates[['start_date', 'end_date']].apply(pd.to_datetime)
- 合并匹配日期区间
通过merge按Code左连接两个DataFrame,让每条业务数据都带上对应Code的所有日期区间:
df_merged = df_table.merge(df_dates, on='Code', how='left')
- 标记需排除的行
用向量化条件判断,标记出Timestamp落在任意对应区间内的行:
df_merged['is_excluded'] = (df_merged['Timestamp'] >= df_merged['start_date']) & (df_merged['Timestamp'] <= df_merged['end_date'])
- 筛选保留目标行
由于同一个Code可能对应多个区间,只要有一个区间命中就需要排除该行。通过groupby按原表索引聚合,取any判断是否命中,最后取反筛选:
# 保留未被标记为排除的行 df_result = df_table[~df_merged.groupby(df_table.index)['is_excluded'].any()]
额外性能优化建议
- 提前对两个DataFrame按
Code排序,能大幅提升merge操作的速度:df_table = df_table.sort_values('Code').reset_index(drop=True) df_dates = df_dates.sort_values('Code').reset_index(drop=True) - 若df_dates中存在重复Code的区间,可先对其按Code去重合并(比如合并重叠区间),进一步减少merge后的数据量,提升后续操作效率。
内容的提问来源于stack exchange,提问作者CTXR
相关产品推荐
相关产品推荐

