如何快速定位DataFrame匹配双列表值的行并高效拼接
性能瓶颈原因
你当前代码运行慢的核心问题是逐次循环全表扫描匹配:每遍历一个条件对,就要对整个DataFrame做两次全列值比较,时间复杂度为O(原表行数 * 条件条数),数据量稍大耗时就会明显上涨。另外原代码存在一处笔误:df.loc["b"]是取行索引为b的行,匹配b列的正确写法是df["b"],该错误也会额外触发异常逻辑拖慢执行效率。
最优提速方案
使用pandas内连接(merge)实现匹配,仅需一次哈希关联操作即可完成所有条件匹配,时间复杂度接近O(原表行数 + 条件条数),相比循环方案性能提升可达百倍以上,250条条件的场景可做到毫秒级返回。
实现代码
先将两个对应位置的条件列表组装为临时条件表,再和原表做内连接,自动保留所有同时满足两列值匹配的行:
import pandas as pd from datetime import datetime # 示例原表 df = pd.DataFrame({'datetimes' : [datetime(2020, 6, 14, 2), datetime(2020, 6, 14, 3), datetime(2020, 6, 14, 4)], 'b' : [0, 1, 2], 'c' : [500, 600, 700]}) # 替换为你实际的两个目标值列表 datetime_list = [datetime(2020,6,14,2), datetime(2020,6,14,4)] b_list = [0,2] # 构造条件表做内连接 cond_df = pd.DataFrame({"datetimes": datetime_list, "b": b_list}) result = df.merge(cond_df, on=["datetimes", "b"], how="inner")
其他可选高效方案
如果需要保留条件列表的原始顺序,或者匹配条件存在重复值,可以选择以下两种方案,性能同样远高于逐行循环:
- 元组集合匹配方案
将对应位置的条件对组装为集合,通过一次行遍历完成匹配,适合中小数据量场景:match_pairs = set(zip(datetime_list, b_list)) result = df[df.apply(lambda row: (row["datetimes"], row["b"]) in match_pairs, axis=1)] - 多列isin匹配方案(pandas 1.2.0及以上版本可用)
直接调用多列等值匹配接口,不需要手动拼接元组:cond_df = pd.DataFrame({"datetimes": datetime_list, "b": b_list}) result = df[df[["datetimes", "b"]].isin(cond_df).all(axis=1)]
注意事项
如果
datetimes列为时间类型,需要保证条件列表里的时间值和原表列的时区、时间精度完全一致,否则会出现匹配遗漏的问题。
内容的提问来源于stack exchange,提问作者Rondalf
相关产品推荐
相关产品推荐

