使用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
相关产品推荐
相关产品推荐

