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

如何在Python的Pandas DataFrame中按两个条件删除行

解决方案:删除指定条件的DataFrame行

问题分析

你之前的代码无效,核心原因有三个:

  • 使用iterrows()时错误操作整个DataFrame而非当前行,df.column1.items()是对整个列的键值对迭代,和字符串"B"比较永远不成立
  • drop()方法未指定要删除的行索引,无法定位目标行
  • 循环逐行操作DataFrame本身效率低,且容易出现逻辑错误

推荐实现方式(矢量化操作,Pandas最优实践)

方法1:布尔索引筛选保留行

直接筛选出不满足删除条件的行,重新赋值给原DataFrame:

import pandas as pd

# 假设你的DataFrame已经创建完成
df = pd.DataFrame({
    'column1': ['A', 'B', 'B', 'B'],
    'column2': [1, 1, 1, 1],
    'columns3': [2, 2, 2, 2],
    'column4': [3.0, 3.0, pd.NA, pd.NA]
})

# 保留:不是(column1为B且column4为NaN)的行
df = df[~((df['column1'] == 'B') & df['column4'].isna())]
print(df)

执行后得到的结果:

column1  column2  columns3  column4
0       A        1         2      3.0
1       B        1         2      3.0

方法2:通过索引删除目标行

先定位要删除的行索引,再批量删除:

# 获取需要删除的行的索引
drop_indices = df[(df['column1'] == 'B') & df['column4'].isna()].index
# 批量删除,inplace=True直接修改原DataFrame
df.drop(drop_indices, inplace=True)

若坚持使用循环(不推荐)

如果一定要用循环实现,需收集目标行索引后批量删除(避免逐行删除的低效):

rows_to_drop = []
for idx, row in df.iterrows():
    # 判断当前行的条件
    if row['column1'] == 'B' and pd.isna(row['column4']):
        rows_to_drop.append(idx)
# 一次性删除所有目标行
df.drop(rows_to_drop, inplace=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:22:09