如何用含列表的字典动态过滤Pandas DataFrame?
动态多列范围过滤的简洁向量化实现
针对你需要根据可变长度字典过滤DataFrame的需求,推荐两种高效的向量化实现方式,完全无需硬编码,适配任意数量的过滤列:
方法一:逐步构建过滤掩码
这种方式可读性强,逻辑清晰,适合需要调试或扩展的场景:
import pandas as pd # 示例DataFrame(替换为你的实际数据) df = pd.DataFrame({ "foo": [40, 60, 90, 110], "bar": [3, 7, 12, 8] }) # Streamlit滑块返回的过滤参数字典 d = { "foo": [50, 100], "bar": [5, 10] } # 初始化掩码为全True(所有行默认保留) mask = pd.Series([True] * len(df), index=df.index) # 遍历字典,逐个叠加过滤条件 for col, (min_val, max_val) in d.items(): # 用&=合并当前列的范围条件,确保所有条件同时满足 mask &= (df[col] >= min_val) & (df[col] <= max_val) # 应用掩码得到过滤后的DataFrame filtered_df = df[mask]
方法二:一行式简洁实现
利用between方法和all()聚合条件,代码更紧凑:
import pandas as pd df = pd.DataFrame({ "foo": [40, 60, 90, 110], "bar": [3, 7, 12, 8] }) d = { "foo": [50, 100], "bar": [5, 10] } # 生成每列的范围布尔值,拼接后取所有列都为True的行 filtered_df = df[ pd.concat( [df[col].between(min_val, max_val) for col, (min_val, max_val) in d.items()], axis=1 ).all(axis=1) ]
核心优势
- 向量化操作:基于pandas原生向量化方法,比循环逐行判断效率高几个数量级
- 动态适配:无论字典中有多少列,代码无需修改,完美适配Streamlit的动态过滤器场景
- 可读性强:两种写法都清晰表达了过滤逻辑,维护成本低
内容的提问来源于stack exchange,提问作者bismo
相关产品推荐
相关产品推荐

