You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用含列表的字典动态过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:30:41