为何df.iloc子DataFrame使用apply+lambda调用函数时出现执行差异?
关于Pandas中apply行遍历的索引差异问题
已知条件
- 给定DataFrame
df,df.iloc[:,:2]返回的子DataFrame如下:
| total_bill | tip |
|---|---|
| 16.99 | 1.02 |
| 10.34 | 1.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。
Code1 正常运行的原因
该Series的索引就是原DataFrame的列名(total_bill、tip),因此用af['total_bill']、af['tip']可以直接定位到对应的值,符合Series的索引规则。Code2 报错的原因
iloc[:,0]是针对二维DataFrame的索引语法,用于提取所有行的第0列。但af是一维Series,仅支持单维度索引,传入二维索引器[:,0]属于“索引器数量过多”,因此触发IndexingError。Code3 正常运行的原因
Series的iloc[0]、iloc[1]是提取一维序列的第0、第1个元素,恰好对应原行的total_bill和tip数值,符合Series的索引规则,因此能正常传入quality函数得到结果。
内容的提问来源于stack exchange,提问作者James C
相关产品推荐
相关产品推荐

