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

使用Pandas Apply调用含双DataFrame与数值参数的函数时触发TypeError错误求助

解决TypeError: 'int' object is not subscriptable的问题

这个问题我碰到过,核心是你在使用apply时的参数传递逻辑搞反了,咱们一步步拆解原因和解决办法:

错误原因分析

你写的代码里,df3['number'].apply(function, args=(df1, df2, df3['number']))存在两个关键问题:

  1. 参数顺序完全颠倒:Series.apply()默认会把当前迭代的每个元素(也就是df3['number']里的单个数字)作为第一个参数传给function,但你的function第一个参数是df1(DataFrame类型),这就导致把int类型的数字传给了需要DataFrame的位置,函数里如果对df1做下标操作(比如df1['col']),自然会报错“int对象不能被下标访问”。
  2. args里传了整个Series:你在args里放了df3['number'],这是一整列数据,而你的function需要的是单个数字,这完全不符合参数要求。

可行的解决办法

方法一:调整函数参数顺序(推荐)

把number放在function的第一个参数位置,剩下的df1、df2作为后续参数,然后用args传递固定的DataFrame:

def function(number, df1, df2):
    # 这里保留你原来的逻辑,注意参数顺序已经调整
    # 比如原来用到number的地方依然正常使用,df1和df2也按原逻辑调用
    pass

df3['result'] = df3['number'].apply(function, args=(df1, df2))

这样apply会自动把每个数字传给第一个参数number,args里的df1和df2会依次作为第二、第三个参数传入函数。

方法二:用Lambda包装函数(不修改原函数)

如果你不想改动原函数的参数顺序,可以用lambda表达式做一层包装,手动指定参数传递顺序:

def function(df1, df2, number):
    # 保留你原来的函数逻辑,参数顺序不变
    pass

df3['result'] = df3['number'].apply(lambda num: function(df1, df2, num))

这里lambda接收每个迭代的num(单个数字),然后按照function要求的顺序把df1、df2、num传进去。

方法三:针对DataFrame整行apply(适用于需要多列的场景)

如果后续你的函数需要用到df3里的其他列,可以改成对整个DataFrame的行进行apply:

def function(df1, df2, number):
    # 原函数逻辑不变
    pass

df3['result'] = df3.apply(lambda row: function(df1, df2, row['number']), axis=1)

axis=1表示按行迭代,lambda里通过row['number']取出当前行的数字参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:58:13