如何用df.apply调用多返回值函数一次性创建DataFrame多列?
问题解答
你写的那种写法不可行,原因有两个:
- 首先,
df_RoadSegments["NewTime"]["link"]是链式索引赋值,这种操作容易触发SettingWithCopyWarning,而且NewTime本身是普通列,不是嵌套的DataFrame,没法直接给它加子列; - 更关键的是,你的lambda里还是每次调用
getrouteinfo,完全没解决重复调用函数浪费计算的问题。
要实现一次性获取两个返回值、避免重复计算的需求,正确的做法是在apply里只调用一次getrouteinfo,取出需要的两个值后以元组返回,再用result_type="expand"参数把结果展开成两列。
给你两种实现方式:
方式一:用嵌套lambda简化写法
df_RoadSegments[["NewTime", "link"]] = df_RoadSegments.apply( lambda x: (lambda res: (res[8], res[9]))(getrouteinfo(x["OriginCoordinates"], x["DestCoordinates"])), axis=1, result_type="expand" )
方式二:定义独立函数,可读性更高
def extract_route_info(row): # 只调用一次函数,保存结果 route_result = getrouteinfo(row["OriginCoordinates"], row["DestCoordinates"]) # 返回需要的两个值(这里假设是索引8和9,根据你的实际需求调整) return route_result[8], route_result[9] # 一次性生成两列 df_RoadSegments[["NewTime", "link"]] = df_RoadSegments.apply(extract_route_info, axis=1, result_type="expand")
这样每一行只会调用一次getrouteinfo,既避免了计算浪费,又能一次性生成你需要的两列。
内容的提问来源于stack exchange,提问作者peetman
相关产品推荐
相关产品推荐

