如何无需exec()实现Pandas中不确定数量条件的行删除?
问题
需要在Pandas DataFrame中根据不确定数量的列值条件删除行,目前通过拼接Python代码字符串并用exec()执行实现,希望找到无需exec()的替代方案。
替代实现
可以通过构建布尔掩码的方式实现,完全规避exec()的安全风险,代码更直观易维护,以下是两种可行方案:
方案一:逐步累积掩码
import pandas as pd class DelTest: def __init__(self, df) -> None: self.df = df.copy() # 复制原DataFrame,避免修改原始数据 def deleteRows(self, conditions): # 初始化掩码:所有行默认保留 mask = pd.Series(True, index=self.df.index) for cond in conditions: # 叠加条件:将满足删除条件的行从掩码中排除 mask &= ~(self.df[cond['col']] == cond['val']) # 用掩码过滤DataFrame,得到最终结果 self.df = self.df[mask] return self.df
方案二:批量生成条件后聚合
import pandas as pd class DelTest: def __init__(self, df) -> None: self.df = df.copy() def deleteRows(self, conditions): # 生成所有条件的布尔序列,按行判断是否全部满足删除条件 delete_mask = pd.concat( [self.df[cond['col']] == cond['val'] for cond in conditions], axis=1 ).all(axis=1) # 保留不满足删除条件的行 self.df = self.df[~delete_mask] return self.df
测试验证
使用原问题中的测试用例验证:
# 测试条件 condition1 = [{'col': 'value1', 'val': 0}] condition2 = [{'col': 'value1', 'val': 0}, {'col': 'value2', 'val': 0}] # 构造测试DataFrame df = pd.DataFrame( data=[['A', 2, 0], ['B', 5, 1], ['C', 0, 1], ['X', 0, 1], ['X', 0, 0]], columns=['name', 'value1', 'value2'] ) print("原DataFrame:") print(df) print("\n执行condition1后结果:") print(DelTest(df).deleteRows(condition1)) print("\n执行condition2后结果:") print(DelTest(df).deleteRows(condition2))
输出结果与原exec()实现完全一致:
原DataFrame: name value1 value2 0 A 2 0 1 B 5 1 2 C 0 1 3 X 0 1 4 X 0 0 执行condition1后结果: name value1 value2 0 A 2 0 1 B 5 1 执行condition2后结果: name value1 value2 0 A 2 0 1 B 5 1 2 C 0 1 3 X 0 1
内容的提问来源于stack exchange,提问作者Shuo
相关产品推荐
相关产品推荐

