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

如何基于指定列表查找并删除Pandas DataFrame中的行?

Pandas新手求助:如何基于列表删除DataFrame中的对应行

原始DataFrame:

name stuff  floats  ints
0     Mike     a     1.0     1
1     Joey     d     2.2     3
2  Zendaya     c     NaN     8
3     John     a     1.0     1
4  Abruzzi     d     NaN     3

待删除列表to_delete:

[['Abruzzi', 'd', pd.NA, 3], ['Mike', 'a', 1.0, 1]]

期望得到的结果DataFrame:

name stuff  floats  ints
1     Joey     d     2.2     3
2  Zendaya     c     NaN     8
3     John     a     1.0     1

请问适合用Pandas的哪种方法实现这个需求?


推荐方法:merge+indicator参数(处理NaN更可靠)

你的待删除行里包含空值pd.NA,而Pandas里NaN和任何值(包括自己)都不相等,直接用简单匹配方法会出错,所以最稳妥的是用合并筛选的思路:

步骤拆解

  1. 把原始数据和待删除列表整理成DataFrame:
import pandas as pd

# 原始DataFrame
df = pd.DataFrame({
    'name': ['Mike', 'Joey', 'Zendaya', 'John', 'Abruzzi'],
    'stuff': ['a', 'd', 'c', 'a', 'd'],
    'floats': [1.0, 2.2, pd.NA, 1.0, pd.NA],
    'ints': [1, 3, 8, 1, 3]
})

# 待删除列表转成DataFrame,列名和原始df一致
to_delete = [['Abruzzi', 'd', pd.NA, 3], ['Mike', 'a', 1.0, 1]]
delete_df = pd.DataFrame(to_delete, columns=df.columns)
  1. 用merge做左连接,通过indicator标记行的来源:
# 左连接后,_merge列会标记行是只在原始df有(left_only),还是两边都有(both)
merged = df.merge(delete_df, how='left', indicator=True)
# 只保留原始df独有的行,也就是不需要删除的行
result = merged[merged['_merge'] == 'left_only'].drop(columns='_merge')

运行后就能得到目标结果,这个方法完美适配包含空值的场景。

补充:无空值场景的简化方法

如果待删除的行里没有空值,也可以用isin快速筛选,但你的数据有NaN,别用这个:

# 生成每行是否在待删除列表里的掩码,取反就是要保留的行
mask = ~df.apply(tuple, axis=1).isin([tuple(row) for row in to_delete])
result = df[mask]

但因为NaN的存在,这个方法会漏判包含NaN的待删除行,所以优先用merge的方法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:05:28