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

Pandas中两个apply调用函数为何一个失效一个正常?

为什么第一个Pandas apply函数无法工作?

你遇到的问题很典型——同样是用apply给DataFrame添加多列,第一个代码块报错,第二个却能正常运行,咱们来一步步拆解原因。

第一个无法运行的代码

import pandas as pd
df = pd.DataFrame(data = {'a': [1, 2, 3], 'b': [4, 5, 6]})
def add_subtract_list(a, b):
    return [1,2,3,4]
add_subtract_list(5,8)
df[['c','d','x','y']] = df.apply( lambda row: add_subtract_list(row['a'], row['b']), axis=1)

第二个可运行的代码(补全你省略的合理逻辑)

import pandas as pd
df = pd.DataFrame(data = {'a': [1, 2, 3], 'b': [4, 5, 6]})
def add_subtract_list(a, b):
    return [a + b, a - b, b + a, b - a]  # 基于每行a、b计算的列表
df[['c','d','x','y']] = df.apply( lambda row: add_subtract_list(row['a'], row['b']), axis=1)

核心原因解析

  • 返回值的维度匹配问题:当你用df.apply(axis=1)返回列表并赋值给多列时,Pandas需要每个行的返回结果能被展开为对应列数的独立值。第一个函数返回的是固定列表[1,2,3,4],但默认情况下apply会把这个列表当成Series的单个元素(也就是每行返回的是一个长度为4的列表对象,而非4个单独的值),这就导致赋值时维度不匹配,直接报错。
  • 第二个代码的正确逻辑:第二个函数返回的是基于当前行a和b计算的列表,虽然看起来和第一个结构类似,但关键在于——当apply返回的列表长度和你要赋值的列数一致时,Pandas会自动将每个列表展开为一行的多个值,刚好匹配4列的需求,所以能正常运行。

修复第一个代码的方法

其实第一个代码只需要给apply加上result_type='expand'参数,强制Pandas把每个列表展开成DataFrame的一行,就能正常赋值了:

df[['c','d','x','y']] = df.apply( lambda row: add_subtract_list(row['a'], row['b']), axis=1, result_type='expand')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:33