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

Pandas多DataFrame条件筛选优化:替代低效循环方案问询

高效实现方案(矢量化操作替代嵌套循环)

步骤说明与代码实现

通过Pandas的矢量化操作完成条件筛选,完全避免嵌套循环,大幅提升大数据量下的处理速度:

import pandas as pd

# 构建示例数据(实际使用时替换为你的真实数据)
df1 = pd.DataFrame({
    'id': [1,2,3],
    'e1': ['2012-09-12', '2009-09-07', '2005-08-09'],
    'e2': ['2001-03-06', '2002-04-06', '2005-06-04'],
    'e3': ['1999-09-03', '2003-01-02', '2008-01-02']
})
# 将df1的日期列转为datetime类型(必须步骤,否则日期比较会出错)
df1[['e1','e2','e3']] = df1[['e1','e2','e3']].apply(pd.to_datetime)

df2 = pd.DataFrame({
    'id': [1,2,3],
    'e1': ['A120', 'BD43', 'C890'],
    'e2': ['B130', 'A200', 'B123'],
    'e3': ['C122', 'A111', 'A190']
})

# 1. 生成df2各列值以'A'开头的布尔矩阵
mask_starts_a = df2.filter(regex='^e').apply(lambda col: col.str.startswith('A'))
# 2. 生成df1各列日期>=2005-01-01的布尔矩阵
mask_date_valid = df1.filter(regex='^e') >= pd.Timestamp('2005-01-01')
# 3. 合并条件:同一位置同时满足两个条件,且行内至少有一个满足的列
keep_ids = (mask_starts_a & mask_date_valid).any(axis=1)
# 4. 提取满足条件的行
result_df = df2.loc[keep_ids]

print(result_df)

代码解释

  • filter(regex='^e'):精准筛选出所有以'e'开头的列(即e1/e2/e3),避免误操作id列
  • str.startswith('A'):矢量化判断字符串开头,比循环快几个数量级
  • 布尔矩阵的&操作:对应位置同时满足两个条件时返回True
  • any(axis=1):只要该行任意一列满足复合条件,就标记为需要保留的行
  • 最终用布尔索引直接筛选df2,完全基于Pandas内部优化的矢量化运算,处理大数据量时性能远超嵌套循环

结果验证

运行后输出与你给出的理想结果一致(注:理想结果中id=1的e3值应为C122,属于笔误,本代码输出与原df2数据一致):

id    e1    e2    e3
0   1  A120  B130  C122
2   3  C890  B123  A190

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:51:02