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

如何不使用循环删除DataFrame中包含在列表内的行?

解决方案

要高效删除DataFrame中与指定元组列表匹配的行,推荐使用以下两种矢量化方法,避免低效的循环操作:

方法1:利用apply(tuple) + isin过滤

将DataFrame的目标列转换为元组序列,通过isin匹配待删除的元组,再取反筛选保留的行:

import pandas as pd
df = pd.DataFrame(
    {
        'A': ['a', 'b', 'c', 'd', 'a', 'd', 'a', 'c'],
        'B': [4, 2, 2, 1, 3, 4, 3, 2],
    }
)
rows_to_remove = [('a', 4), ('c', 2), ('d', 4), ('a', 3)]

# 生成匹配掩码
mask = df[['A', 'B']].apply(tuple, axis=1).isin(rows_to_remove)
# 过滤得到结果
result_df = df[~mask]
print(result_df)

输出结果:

A  B
1  b  2
3  d  1

方法2:使用merge反连接(适合大数据量)

将待删除的元组转换为临时DataFrame,通过左连接标记行的来源,仅保留原DataFrame独有的行:

import pandas as pd
df = pd.DataFrame(
    {
        'A': ['a', 'b', 'c', 'd', 'a', 'd', 'a', 'c'],
        'B': [4, 2, 2, 1, 3, 4, 3, 2],
    }
)
rows_to_remove = [('a', 4), ('c', 2), ('d', 4), ('a', 3)]

# 转换待删除行为DataFrame
remove_df = pd.DataFrame(rows_to_remove, columns=['A', 'B'])
# 左连接并添加来源标记
merged = df.merge(remove_df, on=['A', 'B'], how='left', indicator=True)
# 筛选原DataFrame独有的行,移除标记列
result_df = merged[merged['_merge'] == 'left_only'].drop(columns='_merge')
print(result_df)

输出结果与方法1一致。

方法对比

  • 方法1代码更简洁,理解成本低,适合中小规模数据集;
  • 方法2基于pandas的merge底层优化,在大数据量下性能更稳定,避免apply的潜在性能瓶颈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:50:35