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

使用自定义函数与apply从单列生成多列遇问题,求排查

问题排查:从Route列提取行程信息的函数错误分析

问题背景

我正在使用卡塔尔航空数据集开展小型项目,目标是从Route列提取生成From、To、Via三列。目前通过带正则表达式的自定义函数实现分组提取,但运行过程中出现错误,需要排查函数编写及apply调用中的问题。

原自定义函数代码

import pandas as pd
import numpy as np

def travel_route(row):
    # layover_patt = r"(?P<source>[^,]+)\s+to\s+(?P<destination>[^,]+)\s+via\s+(?P<layover>[^.]+)"
    # direct_patt = r"(?P<source>[^,]+)\s+to\s+(?P<destination>[^,]+)"
    text = row["Route"]
    # text = row
    if "via" in text:
        pattern = r"(?P<source>[^,]+)\s+to\s+(?P<destination>[^,]+)\s+via\s+(?P<layover>[^.]+)"
        source = match.group("source")
        destination = match.group("destination")
        layover = match.group("layover")
        return pd.Series({"From":source,
                          "To":destination,
                          "Via":layover})

    else:
        pattern = r"(?P<source>[^,]+)\s+to\s+(?P<destination>[^,]+)"
        source = match.group("source")
        destination = match.group("destination")        

        return pd.Series({"From":source,
                          "To":destination,
                          "Via":np.nan})

原调用方式

# df_with_route.apply(travel_route,axis=1)
df_with_route = df_with_route["Route"].apply(travel_route)
# df_with_route.head()

测试用例

travel_route("Tokyo to London Heathrow via Doha")
travel_route("Auckland to Doha")

错误点分析

  1. 正则匹配对象未定义:函数中直接使用match.group(),但未导入re模块,也未调用re.search()或re.match()生成匹配对象,会触发NameError。
  2. 参数与调用逻辑不匹配:调用时传入的是Route列的单个字符串元素,但函数中尝试通过row["Route"]索引取值,字符串无法进行字典式索引,触发TypeError。
  3. 正则表达式局限性:使用[^,]+匹配站点名称,若站点名称包含逗号会失效;[^.]+假设中转地无句号,通用性不足。

修正后的代码与调用

修正后的函数

import pandas as pd
import numpy as np
import re

def travel_route(text):
    # 处理含中转的航班
    if "via" in text:
        pattern = r"(?P<source>.+?)\s+to\s+(?P<destination>.+?)\s+via\s+(?P<layover>.+)"
        match = re.search(pattern, text)
        if match:
            return pd.Series({
                "From": match.group("source").strip(),
                "To": match.group("destination").strip(),
                "Via": match.group("layover").strip()
            })
    # 处理直飞航班
    pattern = r"(?P<source>.+?)\s+to\s+(?P<destination>.+)"
    match = re.search(pattern, text)
    if match:
        return pd.Series({
            "From": match.group("source").strip(),
            "To": match.group("destination").strip(),
            "Via": np.nan
        })
    # 匹配失败时返回空值
    return pd.Series({"From": np.nan, "To": np.nan, "Via": np.nan})

正确调用方式

# 新增三列存储提取结果,而非覆盖原DataFrame
df_with_route[["From", "To", "Via"]] = df_with_route["Route"].apply(travel_route)

测试验证

运行测试用例可得到预期结果:

# 测试中转航班
print(travel_route("Tokyo to London Heathrow via Doha"))
# 输出:
# From              Tokyo
# To        London Heathrow
# Via                 Doha
# dtype: object

# 测试直飞航班
print(travel_route("Auckland to Doha"))
# 输出:
# From     Auckland
# To           Doha
# Via           NaN
# dtype: object

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:10:56