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
相关产品推荐
相关产品推荐

