使用自定义函数与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")
错误点分析
- 正则匹配对象未定义:函数中直接使用
match.group(),但未导入re模块,也未调用re.search()或re.match()生成匹配对象,会触发NameError。 - 参数与调用逻辑不匹配:调用时传入的是Route列的单个字符串元素,但函数中尝试通过
row["Route"]索引取值,字符串无法进行字典式索引,触发TypeError。 - 正则表达式局限性:使用
[^,]+匹配站点名称,若站点名称包含逗号会失效;[^.]+假设中转地无句号,通用性不足。
修正后的代码与调用
修正后的函数
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
相关产品推荐
相关产品推荐

