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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:45:41