如何在Pandas Series上应用多if条件并生成新列与结果列表
解决Pandas Series多条件计算并生成新列/结果列表的问题
现有基础代码
你已有的阈值字典和温度Series定义如下:
cardinal_Temp = ["Tbas_veg", "Topt1_veg", "Topt2_veg","Tmax_veg"] wheat_CardTemp_vegetative = [4, 22, 28, 38] Veg_CardTemp= dict(zip(cardinal_Temp, wheat_CardTemp_vegetative)) # 每日温度Series(假设Date_Tmean是你的DataFrame) Tmean = Date_Tmean["Tmean"]
原代码的问题
你写的脚本存在几个关键问题:
- 语法错误:第一个
if语句缺少闭合括号,最后一个elif多了一个右括号 - 向量判断错误:直接对
Series用标量式的if-else会报错,因为Series是多元素向量,条件返回的是布尔值组成的Series,而非单个布尔值 - 无效赋值:最后一行
Tempfunction = df[]会生成空值,导致结果异常
正确实现方案
方案一:用numpy.select(矢量化操作,效率最高)
适合处理大体积数据集,比逐行处理快得多:
import numpy as np # 提前提取阈值,简化代码 t_bas = Veg_CardTemp["Tbas_veg"] t_opt1 = Veg_CardTemp["Topt1_veg"] t_opt2 = Veg_CardTemp["Topt2_veg"] t_max = Veg_CardTemp["Tmax_veg"] # 定义条件列表(按优先级排序) conditions = [ (Tmean > t_bas) & (Tmean < t_opt1), (Tmean >= t_opt1) & (Tmean <= t_opt2), (Tmean > t_opt2) & (Tmean < t_max), (Tmean <= t_bas) | (Tmean >= t_max) ] # 定义对应条件的计算结果 values = [ (Tmean - t_bas) / (t_opt1 - t_bas), 1, (t_max - Tmean) / (t_max - t_opt2), 0 ] # 执行多条件计算 temp_function = np.select(conditions, values) # 将结果存入原DataFrame的新列 Date_Tmean["TempFunction"] = temp_function # 转换为结果列表 result_list = temp_function.tolist()
方案二:用Series.apply(逐行处理,逻辑直观)
如果更习惯逐行判断的写法,可以用apply,但效率略低于矢量化操作:
def calculate_temp_func(temp): t_bas = Veg_CardTemp["Tbas_veg"] t_opt1 = Veg_CardTemp["Topt1_veg"] t_opt2 = Veg_CardTemp["Topt2_veg"] t_max = Veg_CardTemp["Tmax_veg"] if t_bas < temp < t_opt1: return (temp - t_bas) / (t_opt1 - t_bas) elif t_opt1 <= temp <= t_opt2: return 1 elif t_opt2 < temp < t_max: return (t_max - temp) / (t_max - t_opt2) else: return 0 # 应用函数到温度Series temp_function = Tmean.apply(calculate_temp_func) # 存入新列 Date_Tmean["TempFunction"] = temp_function # 转换为结果列表 result_list = temp_function.tolist()
内容的提问来源于stack exchange,提问作者Farhad
相关产品推荐
相关产品推荐

