如何在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
相关产品推荐
相关产品推荐

