在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错误,大概率是踩了这两个坑之一:
- 没指定
axis=1,默认按列处理:如果调用apply时没加axis=1,pandas默认会按列(axis=0)来遍历。这时候传给lambda的是每一列的Series,但如果你的lambda逻辑是想访问行内的多个元素(比如x[0]),当遍历到列里的单个int值时,x就变成了int类型——int当然不能用下标访问,所以直接报错。 - 错误地对单个列调用
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拿到的是单个单元格的数值,不能用下标操作。
怎么修正?
如果你本来就是想处理每一行的多列数据,记住两个关键点:
- 一定要加
axis=1告诉pandas按行处理; - 在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
相关产品推荐
相关产品推荐

