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

如何基于ID前缀利用字典多阈值Pythonic地过滤Pandas DataFrame?

基于ID前缀的多阈值过滤Pandas DataFrame(Pythonic实现)

示例配置与测试数据

先明确场景:我们有一个阈值字典,键是ID的前缀,值是对应允许的最大Value;未匹配到前缀的使用默认阈值。

阈值配置:

thresholds = {
    "A": 10,
    "B": 15,
    "default": 20
}

测试DataFrame:

import pandas as pd

df = pd.DataFrame({
    "ID": ["A001", "A002", "B001", "C001", "C002"],
    "Value": [8, 12, 14, 18, 22]
})

期望过滤结果:保留Value不超过对应前缀阈值的行,最终得到:

IDValue
A0018
B00114
C00118

Pythonic实现方式(无显式循环)

利用Pandas的矢量化操作完成,全程避免循环,代码简洁高效:

步骤1:提取ID前缀

如果前缀是单个字符,直接取ID的第一个字符:

df["Prefix"] = df["ID"].str[0]

如果前缀是多字符(比如AB001的前缀是AB),用正则提取更通用:

df["Prefix"] = df["ID"].str.extract(r'^([A-Z]+)')[0]

步骤2:映射前缀到阈值

用map方法匹配字典,未匹配到的用fillna填充默认阈值:

df["Threshold"] = df["Prefix"].map(thresholds).fillna(thresholds["default"])

步骤3:过滤数据

通过布尔索引直接筛选符合条件的行,最后清理临时列:

filtered_df = df[df["Value"] <= df["Threshold"]].drop(columns=["Prefix", "Threshold"])

合并成一行的简洁写法

如果不需要保留中间列,可以把逻辑合并:

filtered_df = df[
    df["Value"] <= df["ID"].str[0].map(thresholds).fillna(thresholds["default"])
]

说明

这种方式完全依赖Pandas的矢量化API,比显式循环效率高几个数量级,同时代码可读性强,符合Pythonic的"简洁优雅"原则。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:00