如何基于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不超过对应前缀阈值的行,最终得到:
| ID | Value |
|---|---|
| A001 | 8 |
| B001 | 14 |
| C001 | 18 |
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
相关产品推荐
相关产品推荐

