如何用for循环基于另一DataFrame区间标注目标DataFrame数值
批量实现空气质量污染物指标等级分箱
基础数据说明
- 监测数据表
my_data:每行对应一个监测日期的污染物浓度数值,包含so2、co、o3、pm25、no2共5项常规空气污染物指标,构造代码如下:
import pandas as pd import numpy as np my_data = pd.DataFrame.from_dict({ 'so2': [ 5.6, 4.6, 6.1, 10.7, 2.6], 'co': [ 9.1, 8.2, 9.1, 18.1, 3.7], 'o3': [2.9, 11.0, 4.1, 2.1, 18.7], 'pm25': [124.0, 114.0, 104.0, 190.0, 46.0], 'no2': [29.8, 22.4, 26.1, 41.6, 11.5] })
- 等级阈值表
quality_standards_colours:存储各污染物对应绿、黄、橙、红4个颜色等级的区间下限阈值,构造代码如下:
quality_standards_colours = pd.DataFrame.from_dict({ 'Category': ['green', 'yellow',' orange', 'red'], 'so2_min': [0, 0.864, 1.824, 4.464], 'co_min': [0, 13.5, 28.5, 37.5], 'o3_min': [0, 0.165, 0.213, 0.258], 'pm25_min': [0, 12.1, 35.5, 55.5], 'no2_min': [0, 1.296, 2.424, 8.664] })
处理目标
生成分类结果表my_categorized_data,每个单元格值格式为指标名_颜色等级,示例结构如下:
my_categorized_data = pd.DataFrame.from_dict({ 'so2': ['so2_red', 'so2_red', 'so2_red', 'so2_red', 'so2_orange'], 'co': [ 'co_green', 'co_green', 'co_green', 'co_yellow', 'co_green'], 'o3': ['o3_red', 'o3_red', 'o3_red', 'o3_red', 'o3_red'], 'pm25': ['pm25_red', 'pm25_red', 'pm25_red', 'pm25_red', 'pm25_orange'], 'no2': ['no2_red', 'no2_red', 'no2_red', 'no2_red', 'no2_red'] })
现有方案痛点
单指标处理时可手动提取阈值构造分箱边界、生成标签列表后调用pd.cut完成标注,以so2为例的单指标实现代码如下:
bins_so2 = [0, 0.864, 1.824, 4.464, np.inf] # 提取自quality_standards_colours的so2_min列 names = ['so2_green', 'so2_yellow','so2_orange', 'so2_red'] my_data['so2'] = pd.cut(my_data['so2'], bins_so2, labels=names, right=False)
该方案需要为每个指标重复编写逻辑完全一致的代码,指标数量较多时开发效率低、后续维护成本高,需要通过循环批量完成所有指标的分箱处理。
批量实现代码
# 预处理阈值表:清除分类名称前后多余空格,避免标签带空白字符 quality_standards_colours['Category'] = quality_standards_colours['Category'].str.strip() # 初始化结果表,和原数据行索引保持一致 my_categorized_data = pd.DataFrame(index=my_data.index) # 自动提取所有配置了阈值的污染物指标名 pollutant_list = [col.replace('_min', '') for col in quality_standards_colours.columns if col.endswith('_min')] for pollutant in pollutant_list: # 构造分箱边界:提取当前指标的所有下限阈值,末尾追加正无穷作为最高等级上边界 bin_edges = quality_standards_colours[f'{pollutant}_min'].tolist() + [np.inf] # 生成格式为「指标名_等级」的标签列表 level_labels = [f'{pollutant}_{cat}' for cat in quality_standards_colours['Category']] # 分箱标注,right=False指定区间为左闭右开,匹配「大于等于当前下限属于对应等级」的规则 my_categorized_data[pollutant] = pd.cut( x=my_data[pollutant], bins=bin_edges, labels=level_labels, right=False )
方案特性
- 自动适配指标增减:代码自动识别阈值表中所有配置了分箱规则的污染物字段,后续新增监测指标时,仅需在
quality_standards_colours中新增{指标名}_min列、在my_data中新增对应指标数值列即可,无需修改循环逻辑。 - 边界匹配准确:通过
right=False参数设置左闭右开区间,完全匹配「阈值为等级下限」的规则,避免边界值错分、0值识别为空的问题。 - 标签格式规范:提前对分类名称做去空格处理,避免生成带多余空白字符的异常标签。
内容的提问来源于stack exchange,提问作者dev-charodeyka
相关产品推荐
相关产品推荐

