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

Python中用IF ELSE计算PM2.5对应API值报错求助

问题排查与修复

错误根源

你传给calculation函数的y是pandas Series(整列PM2.5数据),但普通if/elif只能判断单个布尔值,直接对Series做0 < y and y <12这类比较会返回一组布尔值,Python没法判定这组值整体是真还是假,所以抛出那个模糊性错误。

两种修复方案

方案1:改函数处理单个值,逐行计算

把函数改成只处理单个数值,再用apply遍历每一行的PM2.5值:

import pandas as pd

# 读取数据时加skipinitialspace=True,避免原CSV里的逗号导致列名带空格
df = pd.read_csv('xx.csv', skipinitialspace=True)

def calc_api(y):
    if 0 < y < 12:
        return (50/12)*y
    elif 12.1 <= y <= 50.4:
        return (((100-51)/(50.4-12.1))*(y-12.1)) + 51
    elif 50.5 <= y <= 55.4:
        return (((150-101)/(55.4-50.5))*(y-50.5)) + 101
    elif 55.5 <= y <= 150.4:
        return (((200-151)/(150.4-55.5))*(y-55.5)) + 151
    elif 150.5 <= y <= 250.4:
        return (((300-201)/(250.4-150.5))*(y-150.5)) + 201
    elif 250.5 <= y <= 350.4:
        return (((400-301)/(350.4-250.5))*(y-250.5)) + 301
    else:
        return (((500-401)/(500.4-350.5))*(y-350.5)) + 401

# 生成API列
df['API'] = df['PM2.5'].apply(calc_api)
print(df)

方案2:向量化计算(推荐,大数据更快)

用numpy.select实现批量计算,不用逐行循环:

import pandas as pd
import numpy as np

df = pd.read_csv('xx.csv', skipinitialspace=True)

# 定义各区间的条件
conditions = [
    (df['PM2.5'] > 0) & (df['PM2.5'] < 12),
    (df['PM2.5'] >= 12.1) & (df['PM2.5'] <= 50.4),
    (df['PM2.5'] >= 50.5) & (df['PM2.5'] <= 55.4),
    (df['PM2.5'] >= 55.5) & (df['PM2.5'] <= 150.4),
    (df['PM2.5'] >= 150.5) & (df['PM2.5'] <= 250.4),
    (df['PM2.5'] >= 250.5) & (df['PM2.5'] <= 350.4)
]

# 对应每个条件的API计算公式
results = [
    (50/12)*df['PM2.5'],
    (((100-51)/(50.4-12.1))*(df['PM2.5']-12.1)) + 51,
    (((150-101)/(55.4-50.5))*(df['PM2.5']-50.5)) + 101,
    (((200-151)/(150.4-55.5))*(df['PM2.5']-55.5)) + 151,
    (((300-201)/(250.4-150.5))*(df['PM2.5']-150.5)) + 201,
    (((400-301)/(350.4-250.5))*(df['PM2.5']-250.5)) + 301
]

# 不符合所有条件时的默认计算逻辑
default = (((500-401)/(500.4-350.5))*(df['PM2.5']-350.5)) + 401

# 批量生成API列
df['API'] = np.select(conditions, results, default=default)
print(df)

额外提醒

  • 原CSV里PM2.5列名后面带逗号,读取时加skipinitialspace=True能避免列名出现多余空格
  • 你的区间里12到12.1之间有空白(比如12.05),这类值会走到else分支,要是不符合预期得调整区间边界

内容的提问来源于stack exchange,提问作者TAM Tze Huey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:20:29