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

基于多列值元组过滤Pandas DataFrame,规避df.iterrows()低效问题

高效过滤Pandas DataFrame指定行(避开低效的iterrows())

嘿,刚好处理过类似的需求,给你分享两种高效的实现方式,完全不用碰iterrows()这种拖慢大型数据集的方法:

方案一:用pd.merge()(你已经验证可行的思路,再细化下)

这个方法利用Pandas的向量化合并逻辑,效率比逐行迭代高太多,而且代码简洁:

第一步:准备数据

先把你的文本文件里的配对转换成一个小的参考DataFrame(直接从文件读取更方便):

import pandas as pd

# 你的原始大型DataFrame(模拟示例)
df = pd.DataFrame({
    'user1': ['Alice', 'Alice', 'Bob', 'Alice'],
    'user2': ['Carol', 'Bob', 'Carol', 'Carol'],
    # 这里替换成你的实际其他列
    'other_col1': [1, 2, 3, 4],
    'other_col2': ['x', 'y', 'z', 'w']
})

# 从文本文件加载配对列表(假设文件名叫pair_list.txt)
with open('pair_list.txt', 'r') as f:
    # 处理每行的配对,去掉空行
    pairs = [line.strip().split(',') for line in f if line.strip()]
# 转换成参考DataFrame,列名要和原始DataFrame对应
ref_df = pd.DataFrame(pairs, columns=['user1', 'user2'])

第二步:执行合并过滤

通过merge()方法,指定匹配的列['user1','user2'],这样会自动保留两个DataFrame中这两列完全匹配的行,同时保留原始DataFrame的所有其他列:

filtered_df = pd.merge(df, ref_df, on=['user1', 'user2'])

运行后得到的结果就是你要的:

user1  user2  other_col1 other_col2
0  Alice  Carol           1          x
1  Alice  Carol           4          w
2    Bob  Carol           3          z

方案二:用isin()+元组集合,逻辑更直观

如果你觉得merge的思路有点绕,还可以把配对转换成元组集合,用isin()来过滤:

import pandas as pd

# 加载配对并转成元组集合
valid_pairs = set()
with open('pair_list.txt', 'r') as f:
    for line in f:
        line = line.strip()
        if line:
            u1, u2 = line.split(',')
            valid_pairs.add((u1, u2))

# 对原始DataFrame进行过滤
filtered_df = df[df[['user1', 'user2']].apply(tuple, axis=1).isin(valid_pairs)]

这个方法同样是向量化操作,效率拉满,适合不想额外创建参考DataFrame的场景。

为什么不推荐iterrows()?

iterrows()是纯Python层面的逐行迭代,面对大型DataFrame时,速度会比Pandas的向量化操作慢几十甚至上百倍,完全没必要用它来做这种过滤操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:21