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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:06:00