如何基于lambda删除DataFrame中符合指定条件的行?
解决DataFrame按动态条件删除行的问题
当然可以实现你的需求,先给你两种可行的方案:一种是pandas官方更推荐的高效写法,另一种就是你想要的类似apply的实现方式,先从你的示例数据说起。
首先先构造你给出的示例DataFrame:
import pandas as pd data = { 'F': [0, 1, 2], 'T': ['0', '', '2'], 'l': ['0', '1', ''] } df = pd.DataFrame(data)
方案一:布尔索引+isin(推荐,效率更高)
这种方式不需要用到apply,利用pandas的向量化操作,处理大数据集时速度会快很多。你可以先定义好运行时的空值列表,然后通过布尔条件过滤出需要保留的行:
# 运行时动态定义空值条件 empty_values = ['', 'N/A'] # 保留T和l列的值都不在空值列表里的行 filtered_df = df[(~df['T'].isin(empty_values)) & (~df['l'].isin(empty_values))]
解释一下:
df['T'].isin(empty_values)会返回一个布尔Series,标记T列的值是否在空值列表里~用来取反,也就是筛选出不在空值列表里的行&表示逻辑与,确保T和l列都满足非空条件
运行后得到的结果就是你想要的:
F T l 0 0 0 0
方案二:用apply逐行判断(符合你的设想)
如果你确实想用类似apply的写法,也是可以的,通过apply逐行检查条件,保留符合要求的行。不过要注意,这种方式是逐行处理,数据量大的时候效率不如方案一:
empty_values = ['', 'N/A'] # 按行应用lambda函数,返回True的行会被保留 filtered_df = df[df.apply(lambda row: row['T'] not in empty_values and row['l'] not in empty_values, axis=1)]
这里的关键是axis=1,表示对每一行应用lambda函数,lambda函数判断当前行的T和l列是否都不在空值列表里,返回布尔值,最后用这个布尔Series来过滤原DataFrame。
为什么你之前的df.drop.apply写法不行?
df.drop()方法是用来删除指定的行/列,它需要传入行索引、列名或者布尔索引,不能直接在drop上调用apply。正确的思路是先通过apply生成需要保留的行的布尔标记,再用这个标记去过滤原DataFrame,就像上面的方案二那样。
内容的提问来源于stack exchange,提问作者Agus
相关产品推荐
相关产品推荐

