Python中用apply函数替代for循环遍历DataFrame不生效问题求助
问题解决
核心错误原因
- 你之前调用apply的对象错误:应该遍历存储角度的
df_2[0]列,而非空的direction列 - apply传参逻辑错误:你直接调用了
determine_direction函数而非将可调用对象传入apply,且参数顺序不匹配 - 原
determine_direction函数未做无匹配场景兼容,遇到不在区间内的角度会抛出索引异常
修复后完整代码
import pandas as pd def determine_direction(df, fl_wr): # 根据角度匹配风向 # 入参: 角度值 - float # 返回: 风向字符串 - string df_vlaremwindsel = df[(df['from'] <= fl_wr) & (fl_wr < df['to'])] # 增加无匹配兜底,避免索引报错 if df_vlaremwindsel.empty: return '未知' str_direction = df_vlaremwindsel.index[0] return str_direction # 风向区间映射表 lst_1 = {'NO': [22.5, 67.5], 'O': [67.5, 112.5], 'ZO': [112.5, 157.5], 'Z': [157.5, 202.5], 'ZW': [202.5, 257.5], 'W': [257.5, 292.5], 'NW': [292.5, 337.5], 'NNW': [337.5, 360.5], 'NNO': [0.5, 22.5], 'N': [0, 0.5]} df_1= pd.DataFrame.from_dict(data=lst_1, orient='index', columns=['from', 'to']) # 测试角度数据 lst_2 = [25.0, 88.1, 11, 356, 278, 169, 69, 1, 246] df_2= pd.DataFrame.from_dict(data=lst_2) # 正确apply写法,用lambda包裹自定义函数传入额外参数df_1 df_2['direction'] = df_2[0].apply(lambda x: determine_direction(df_1, x)) print(df_2)
额外性能优化建议
如果数据量很大,用pd.cut实现区间匹配性能远高于apply,无需自定义函数也无需循环,实现逻辑如下:
# 提取区间边界和对应风向标签 bins = df_1['from'].sort_values().tolist() + [360.5] labels = df_1.sort_values('from').index.tolist() df_2['direction'] = pd.cut(df_2[0], bins=bins, labels=labels, right=False)
内容的提问来源于stack exchange,提问作者Kris De Beleir
相关产品推荐
相关产品推荐

