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

使用apply+Lambda实现DataFrame列间逐列除法报错求助

解决DataFrame列间逐列相除的apply用法问题

错误原因分析

  • 第一段代码错误:apply默认axis=0,此时lambda的x是每一列的Series对象,不是列索引位置。用x+1做iloc索引,本质是拿Series和整数运算,结果不是合法索引,导致越界报错。
  • 第二段代码错误:设置axis=1后,lambda的x变成每一行的Series对象,x < df.shape[1]是将整个Series与整数比较,Pandas无法判断整个Series的布尔值,因此抛出歧义错误。

正确实现方式

方式一:用apply+lambda实现(符合需求)

import pandas as pd
import numpy as np

# 测试用DataFrame
df = pd.DataFrame(np.random.randint(1, 10, (5, 10)), columns=[f'col{i}' for i in range(10)])

# 逐列除以前一列,第一列无前置列,填充NaN
result = df.apply(
    lambda col: col / df.iloc[:, df.columns.get_loc(col.name)-1] 
    if df.columns.get_loc(col.name) > 0 
    else np.nan,
    axis=0
)
  • 逻辑说明:axis=0让apply遍历每一列;通过col.name获取当前列名,再用get_loc拿到列的索引位置;判断非第一列时,执行当前列除以前一列的操作。

方式二:用shift更高效(无需apply)

如果不限制必须用apply,这种方法更简洁高效:

# 右移一列后与原df相除,去掉第一列的NaN结果
result = df / df.shift(axis=1)
result = result.iloc[:, 1:]

内容的提问来源于stack exchange,提问作者actsci stud tries2learn math

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:42:36