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

为何df.iloc子DataFrame使用apply+lambda调用函数时出现执行差异?

关于Pandas中apply行遍历的索引差异问题

已知条件

  • 给定DataFrame df,df.iloc[:,:2] 返回的子DataFrame如下:
total_billtip
16.991.02
10.341.56
  • 定义判断函数(注:原函数else分支漏写return,已补全):
def quality(total_bill, tip):
    if tip/total_bill > 0.25: 
        return 'good tip'
    else: 
        return 'others'
  • df[['total_bill','tip']] 与 df.iloc[:,:2] 返回的DataFrame完全一致。

代码执行差异

Code 1

df[['total_bill','tip']].apply(lambda af: quality(af['total_bill'], af['tip']), axis = 1)

返回结果:

0    others
1    others
dtype: object

Code 2

df.iloc[:,:2].apply(lambda af: quality(af.iloc[:,0],af.iloc[:,1]), axis = 1)

报错信息:

IndexingError: Too many indexers

Code 3

df.iloc[:,:2].apply(lambda af: quality(af.iloc[0],af.iloc[1]), axis = 1)

返回结果:

0    others
1    others
dtype: object

差异原因解析

核心逻辑:当apply指定axis=1时,传入lambda的参数af是一维Series对象,而非二维DataFrame——不管你是用列名还是iloc截取的子DataFrame,行遍历的apply都会把每一行转成单条Series。

  1. Code1 正常运行的原因
    该Series的索引就是原DataFrame的列名(total_bill、tip),因此用af['total_bill']、af['tip']可以直接定位到对应的值,符合Series的索引规则。

  2. Code2 报错的原因
    iloc[:,0]是针对二维DataFrame的索引语法,用于提取所有行的第0列。但af是一维Series,仅支持单维度索引,传入二维索引器[:,0]属于“索引器数量过多”,因此触发IndexingError。

  3. Code3 正常运行的原因
    Series的iloc[0]、iloc[1]是提取一维序列的第0、第1个元素,恰好对应原行的total_bill和tip数值,符合Series的索引规则,因此能正常传入quality函数得到结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:40:20