Pandas Series与含组合类别及默认值的阈值的通用比较实现
Pandas Series与含组合类别及默认值的阈值的通用比较实现
我完全理解你的困扰——分开处理「单个类别+默认阈值」或者「组合类别」都没问题,但要把两者结合起来就有点摸不着头绪了。其实咱们可以把这两个思路整合一下,实现一个通用的解决方案,完美覆盖你的需求。
完整实现步骤
核心思路是:先处理阈值里的自定义组合/单个类别,计算对应的值总和;再找出那些没被自定义规则覆盖的类别,用默认阈值处理;最后把两部分合并后做比较。
1. 准备基础数据
先把你的原始数据整理出来:
import pandas as pd s1 = pd.Series({"A": 0.2, "B": 0.3, "C": 0.3, "D": 0.9}) threshold = {"custom": {"A, B": 0.6, "C": 0.3}, "default": 0.4}
2. 处理自定义阈值的组合/单个类别
遍历自定义阈值里的每个分组,计算s1中对应类别值的总和,同时保留分组的原始命名(比如"A,B"):
custom_groups = threshold["custom"] # 计算每个自定义分组对应的s1值之和 grouped_values = pd.Series({ group_name: s1[group.split(", ")].sum() for group_name, _ in custom_groups.items() })
这一步后,grouped_values的结果是:
A,B 0.5 C 0.3 dtype: float64
3. 处理未被自定义覆盖的类别(用默认阈值)
接下来找出s1里哪些类别没有出现在任何自定义分组中,这些类别统一用默认阈值:
# 提取所有在自定义阈值中出现过的单个类别 custom_categories = set() for group in custom_groups.keys(): custom_categories.update(group.split(", ")) # 筛选出s1中未被自定义规则覆盖的类别 uncategorized = s1.index.difference(custom_categories) uncategorized_values = s1.loc[uncategorized]
4. 合并数据并完成比较
把自定义分组的结果和未覆盖类别的结果合并,对应的阈值也同步合并,最后执行小于比较:
# 合并计算值 all_values = pd.concat([grouped_values, uncategorized_values]) # 合并阈值 all_thresholds = pd.concat([pd.Series(custom_groups), pd.Series(threshold["default"], index=uncategorized)]) # 执行比较 result = all_values < all_thresholds
运行后,result就是你想要的最终结果:
A,B True C False D False dtype: bool
方案优势说明
这个方法把你之前的两个子问题完美融合:
- 既保留了自定义组合类别的求和逻辑,也维持了你需要的分组索引格式
- 自动识别未被自定义规则覆盖的类别,自动应用默认阈值
- 逻辑通用,不管自定义分组是多类别组合还是单个类别,也不管有多少个未覆盖的类别,都能正常运行
备注:内容来源于stack exchange,提问作者greenLeopard
相关产品推荐
相关产品推荐

