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

Python DataFrame如何根据气温、降水量对降水类型进行分类?

错误原因

  • 你在apply对应的自定义函数里错误调用了全量DataFrame的列smhi['Temperature']、smhi['Precipitation'],而apply逐行遍历的时候,传入函数的参数x才代表当前行的数据,直接用全列做比较会返回布尔类型的Series,if无法直接判断Series的真值,所以触发了你看到的报错。
  • 原有函数存在逻辑错误:多处应该给降水分类列PreciCateg赋值的场景,错误写成了修改气温列Temperature。
  • 条件判断顺序有问题,小范围阈值的判断应该放在前面,否则会被大范围的条件提前拦截,导致分类错误。
  • 没有优先判断无降水的场景,会导致降水量为0的行被错误分类,同时apply调用没有加axis=1参数,默认会按列遍历而不是按行遍历。

修复后的实现代码

写法1:apply逐行判断(适合小数据量)

def func(x):
    # 优先判断无降水
    if x['Precipitation'] <= 0:
        return '0'
    # 按温度阈值从低到高判断
    if x['Temperature'] < -8 and x['Precipitation'] > 1:
        return '1'
    elif x['Temperature'] < -2 and x['Precipitation'] > 1:
        return '2'
    elif x['Temperature'] < 5:
        if x['Precipitation'] > 0.5:
            return '5'
        elif x['Precipitation'] > 0.2:
            return '6'
    elif x['Temperature'] < 20:
        if x['Precipitation'] < 1:
            return '4'
        else:
            return '3'
    elif x['Temperature'] < 30 and x['Precipitation'] >= 1:
        return '3'
    # 剩余异常情况归为无降水
    return '0'

smhi['PreciCateg'] = smhi.apply(func, axis=1)

写法2:向量化判断(适合大数据量,效率更高)

import numpy as np

conditions = [
    # 无降水
    smhi['Precipitation'] <= 0,
    # 雪
    (smhi['Temperature'] < -8) & (smhi['Precipitation'] > 1),
    # 雨夹雪
    (smhi['Temperature'] < -2) & (smhi['Precipitation'] > 1),
    # 冻雨
    (smhi['Temperature'] < 5) & (smhi['Precipitation'] > 0.5),
    # 冻毛毛雨
    (smhi['Temperature'] < 5) & (smhi['Precipitation'] > 0.2),
    # 毛毛雨
    (smhi['Temperature'] < 20) & (smhi['Precipitation'] < 1) & (smhi['Precipitation'] > 0),
    # 雨
    (smhi['Temperature'] < 30) & (smhi['Precipitation'] >= 1)
]
values = ['0', '1', '2', '5', '6', '4', '3']

smhi['PreciCateg'] = np.select(conditions, values, default='0')

内容的提问来源于stack exchange,提问作者Gaurang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:15:05