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
相关产品推荐
相关产品推荐

