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

在Pandas序列应用方法时遇'int' object is not subscriptable错误排查

两种Lambda写法的差异与错误原因分析

嘿,我来帮你拆解这个问题!首先得明确pandas里apply函数的两种调用逻辑,这就是你两种写法差异的核心所在。

先看你第一种(正确的)写法

我猜你应该是对整个stocks_df调用了apply,并且指定了axis=1,类似这样:

stocks_df.apply(lambda row: row['Open'] - row['Close'], axis=1)

这种情况下,传给lambda的参数row是每一行的Series对象——简单说就是一整行的数据打包成了一个类似字典的结构,所以你可以用row['列名']或者下标去访问该行的任意元素,自然不会触发错误。

再看报错的第二种写法

你遇到的'int' object is not subscriptable错误,大概率是踩了这两个坑之一:

  1. 没指定axis=1,默认按列处理:如果调用apply时没加axis=1,pandas默认会按列(axis=0)来遍历。这时候传给lambda的是每一列的Series,但如果你的lambda逻辑是想访问行内的多个元素(比如x[0]),当遍历到列里的单个int值时,x就变成了int类型——int当然不能用下标访问,所以直接报错。
  2. 错误地对单个列调用apply:比如你写成了stocks_df['Open'].apply(lambda x: x[0]),这时候传给lambda的是Open列的每个单独数值(int/float),你再用x[0]去取"第一个元素",自然就会报错,因为单个数值根本没有下标这一说。

核心差异一句话总结

  • 当对整个DataFrame用apply且加axis=1:lambda拿到的是整行数据(Series),可以自由访问行内的不同列值。
  • 当对单个列用apply,或对DataFrame用apply但没加axis=1:lambda拿到的是单个单元格的数值,不能用下标操作。

怎么修正?

如果你本来就是想处理每一行的多列数据,记住两个关键点:

  1. 一定要加axis=1告诉pandas按行处理;
  2. 在lambda里用列名(比如row['Open'])来访问该行的对应值,而不是用下标去"拆"单个值。

举个对比例子更清楚:
✅ 正确写法:

# 计算每行开盘价和收盘价的差值
stocks_df['PriceDiff'] = stocks_df.apply(lambda row: row['Open'] - row['Close'], axis=1)

❌ 错误写法(无axis参数):

# 这里会报错,因为默认按列处理,lambda拿到的是列的Series,遍历到单个int时x['Open']无效
stocks_df['PriceDiff'] = stocks_df.apply(lambda x: x['Open'] - x['Close'])

❌ 另一种错误写法(对单列apply):

# 传入lambda的是单个int值,x[0]完全无意义
stocks_df['Open'].apply(lambda x: x[0])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:12:07