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

如何删除Pandas DataFrame中ID存在于指定列表的行?

解决方法:删除DataFrame中ID在指定列表里的行

先说说你之前代码的问题:

  • 语法错误:dataframe.loc(j,"ID")要改用方括号dataframe.loc[j,"ID"],圆括号是函数调用的写法,而loc是索引器,必须用方括号。
  • 循环删除的致命问题:循环过程中你在原地删除行,DataFrame的长度会动态变化,但循环的range是一开始就固定好的,这会导致后续索引越界或者漏删行;而且循环遍历处理DataFrame本身效率极低,Pandas完全不推荐这种写法。
  • 第二个循环完全多余:list_x[k]是单个元素,in list_x[k]是检查字符是否在字符串中,如果ID是数字类型直接会报错,嵌套循环纯粹是做无用功。

正确的做法(Pandas矢量化操作)

直接用isin()方法判断ID是否在目标列表中,再用~取反保留不在列表里的行,一行代码就能搞定:

举个实际示例:

import pandas as pd

# 示例DataFrame
df = pd.DataFrame({
    "ID": [1,2,3,4,1,5],
    "Value": ["a","b","c","d","e","f"]
})

list_x = [1,1,2,3]  # 包含重复值的目标列表

# 方法1:重新赋值(推荐,避免原地修改的副作用)
df_filtered = df[~df["ID"].isin(list_x)]

# 方法2:原地修改(如果确实需要直接修改原DataFrame)
# df.drop(df[df["ID"].isin(list_x)].index, inplace=True)

print(df_filtered)

输出结果:

ID Value
3   4     d
5   5     f

为什么这么做更合理?

  • df["ID"].isin(list_x)会返回一个布尔型Series,每个元素对应该行的ID是否存在于list_x中(列表里的重复值不影响判断结果)。
  • ~是取反运算符,会把布尔Series里的True和False互换,从而筛选出ID不在list_x里的行。
  • 这种矢量化操作比循环快数倍甚至数十倍,尤其是数据量较大时,还不会出现索引混乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:50:32