使用Pandas Apply调用含双DataFrame与数值参数的函数时触发TypeError错误求助
解决TypeError: 'int' object is not subscriptable的问题
这个问题我碰到过,核心是你在使用apply时的参数传递逻辑搞反了,咱们一步步拆解原因和解决办法:
错误原因分析
你写的代码里,df3['number'].apply(function, args=(df1, df2, df3['number']))存在两个关键问题:
- 参数顺序完全颠倒:
Series.apply()默认会把当前迭代的每个元素(也就是df3['number']里的单个数字)作为第一个参数传给function,但你的function第一个参数是df1(DataFrame类型),这就导致把int类型的数字传给了需要DataFrame的位置,函数里如果对df1做下标操作(比如df1['col']),自然会报错“int对象不能被下标访问”。 - 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
相关产品推荐
相关产品推荐

