最直接的多列条件行删除应使用 df.loc[~(...)] 而非 df.drop() 配合布尔索引;需用括号包裹子条件,& 代替 and;NaN 判断须用 isna();所有删除操作必须显式赋值,inplace=True 已弃用。

用 df.loc[~(...)] 做多列条件行删除最直接
别碰 df.drop() 配合布尔索引,它不直观还容易索引错位。直接用 df.loc 取反逻辑最稳:df = df.loc[~((df['A'] > 5) & (df['B'] == 'x'))]。注意必须用括号把每个子条件包住,& 是位与操作符,不是 and;Python 的 and 在 Pandas 里会报 ValueError: The truth value of a Series is ambiguous。
删除含空值(NaN)的多列组合行要小心 isna()
比如想删掉「col1 为空且 col2 小于 10」的行,不能写 df['col1'] == np.nan——NaN 不等于自己。得用 df['col1'].isna()。完整写法:df = df.loc[~(df['col1'].isna() & (df['col2'] 。如果用 <code>query(),得写成 df.query("not (col1 != col1 and col2 ,可读性差,不推荐。
query() 适合简单字符串条件,但对混合类型或函数调用支持弱
query() 写起来像 SQL,看着清爽,但有硬伤:不支持 isna()、str.contains() 这类方法直接调用,也不能用变量名带点号(如 df['a.b']);还要求列名不能是关键字(比如列叫 class 就得用反引号)。安全用法举例:df.query("age > 30 and city in ['Beijing', 'Shanghai']")。一旦条件里要算 df['x'].apply(lambda v: ...) 或判断是否为 None,立刻切回 loc。
原地修改还是赋值?记住 inplace=True 在新版本已弃用
Pandas 2.0+ 已移除 drop(..., inplace=True) 的支持,强行用会报 FutureWarning 并失效。所有删除操作都得显式赋值:df = df.loc[...]。如果数据量大,担心内存复制开销,可以加 copy=False(仅当确定没共享内存时才安全),但多数场景没必要折腾。真正容易被忽略的是链式赋值警告——别写 df.loc[...]['col'] = 0,这不会改原 DataFrame,得用 .loc 一次性定位到行列。
立即学习“Python免费学习笔记(深入)”;


















