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

Pandas Apply调用函数时仅用首行输入而非每行输入的问题

问题分析与解决方法

你的问题是apply调用自定义函数时,所有行返回的都是第一行的坐标结果,核心原因是GetStopsCoordinates函数的实现存在状态保留或参数未正确使用的问题,以下是具体排查和解决步骤:

1. 检查并修复GetStopsCoordinates函数

首先确认函数内部是否正确使用传入的RoadSegmentOrigin参数,避免出现全局变量缓存、静态变量或只执行一次查询的逻辑。

正确的函数示例:

def GetStopsCoordinates(df_stops, stop_id):
    # 根据传入的stop_id精准筛选对应的坐标行
    coord_row = df_stops[df_stops["stop_id"] == stop_id].iloc[0]
    # 拼接成坐标字符串返回
    return f"{coord_row['latitude']},{coord_row['longitude']}"

排查点:

  • 函数内是否存在全局变量存储查询结果,导致后续调用直接返回初始值?
  • 是否在函数外部提前执行了查询,而函数内部只是返回固定结果?
  • 筛选df_Stops时是否写错了列名(比如把stop_id写成了固定值)?

2. 更高效的替代方案:使用merge代替apply

apply逐行处理效率较低,且容易出现函数状态问题,推荐用pandas的向量化合并操作实现:

# 从df_Stops中提取stop_id和拼接好的坐标字符串
df_stop_coords = df_Stops.assign(
    OriginCoordinates=lambda x: x["latitude"].astype(str) + "," + x["longitude"].astype(str)
)[["stop_id", "OriginCoordinates"]]

# 将坐标合并到主数据框中
df_RoadSegments = df_RoadSegments.merge(
    df_stop_coords, 
    left_on="RoadSegmentOrigin", 
    right_on="stop_id", 
    how="left"
)

这种方法完全利用pandas的向量化运算,不仅效率更高,还能避免自定义函数可能带来的各种问题。

3. 调试验证

如果不确定问题出在哪,可以在GetStopsCoordinates函数中添加打印语句,确认每次传入的参数是否正确:

def GetStopsCoordinates(df_stops, stop_id):
    print(f"当前处理的站点ID: {stop_id}")  # 打印传入的参数
    # 原有逻辑...

如果打印的stop_id都是第一行的AREI2,那需要检查apply的lambda表达式是否写错;如果打印的stop_id是逐行变化的,那肯定是函数内部逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:11:30