如何根据列表中的筛选条件对Pandas DataFrame进行筛选
如何根据列表中的筛选条件对Pandas DataFrame进行筛选
嘿,我懂你说的这种需求!有时候我们会提前准备好几个不同的筛选规则,然后根据业务逻辑选其中一个来过滤DataFrame,这完全可以实现,我给你分享几个实用的方法,你可以根据自己的情况选~
方法一:用字符串条件 + eval()
如果你的筛选条件是以字符串形式存在列表里,直接用eval()就能把字符串转换成可执行的筛选逻辑,生成布尔掩码来过滤DataFrame。举个实际例子:
首先创建测试用的DataFrame:
import pandas as pd df = pd.DataFrame({'col1': [1, 4, 2, 5, 3], 'col2': ['a', 'b', 'c', 'd', 'e']})
然后定义你的筛选条件列表:
filter_ls = [ 'df.col1 > 3', # 第一个条件:col1大于3 'df.col2 == "b"', # 第二个条件:col2等于b '(df.col1 > 2) & (df.col2 != "d")' # 第三个条件:col1大于2且col2不等于d ]
假设根据之前的逻辑,你要选列表里第0个条件,那就这么做:
# 选中目标筛选条件 selected_filter = filter_ls[0] # 用eval生成布尔掩码 mask = eval(selected_filter) # 过滤DataFrame filtered_df = df[mask] print(filtered_df)
不过要注意哦,如果你的筛选条件来自不可信的外部来源,eval()会有安全风险,因为它会执行任意代码,这时候建议用下面的方法。
方法二:用lambda函数存筛选条件
把每个筛选规则写成lambda函数,让它接收DataFrame作为参数,返回对应的布尔掩码,这种方式更安全,也更灵活。
还是用刚才的DataFrame,定义lambda形式的条件列表:
filter_ls = [ lambda df: df.col1 > 3, lambda df: df.col2 == "b", lambda df: (df.col1 > 2) & (df.col2 != "d") ]
选中条件后直接调用lambda函数就能过滤:
selected_filter = filter_ls[0] filtered_df = df[selected_filter(df)] print(filtered_df)
这种方法完全不用担心安全问题,因为lambda是你预先定义好的逻辑,不会执行未知代码,推荐在条件可控的时候使用。
方法三:用query()方法
Pandas的query()方法支持用字符串写筛选条件,语法更简洁,不需要写df.前缀,用起来很顺手,而且安全性也不错。
同样的DataFrame,定义简洁版的条件列表:
filter_ls = [ 'col1 > 3', 'col2 == "b"', 'col1 > 2 and col2 != "d"' ]
然后用query()执行筛选:
selected_filter = filter_ls[0] filtered_df = df.query(selected_filter) print(filtered_df)
这个方法的可读性很高,适合写一些不太复杂的筛选条件,用起来特别省心。
内容来源于stack exchange
相关产品推荐
相关产品推荐

