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

