如何在Python DataFrame的iloc、shift等函数中使用列值?
报错原因说明
- 针对
iloc报错:iloc仅支持传入单个整数、整数列表/数组作为位置索引,不支持直接传入等长Series实现逐行对应取值。你传入的df['B']是完整Series,且当B列存在重复值、超出df索引范围的值时,pandas无法完成对齐重排,因此抛出cannot reindex from a duplicate axis错误。 - 针对
shift()报错:shift()的移位周期参数要求传入单个整数值,无法直接传入Series实现每行按不同偏移量移位,pandas在判断移位参数时出现多值判断冲突,因此抛出The truth value of a Series is ambiguous错误。
实现方法
你的需求可以实现,推荐使用numpy高级索引完成,性能远高于逐行遍历操作:
import pandas as pd import numpy as np # 示例数据 d = {'A': [8, 2, 4, 5, 6, 4, 3, 5, 5, 3], 'B': [2, -1, 4, 5, 0, -3, 8, 2, 6, -1]} df = pd.DataFrame(data=d) # 构造每行对应的目标位置:若需和shift(B)逻辑一致(偏移B个周期)则用 index - B,可按需调整计算逻辑 pos = df.index - df['B'] # 过滤超出有效索引范围的位置(小于0或大于等于df长度的位置标记为无效) pos = pos.where((pos >= 0) & (pos < len(df)), np.nan) # 按位置取值,无效位置返回NaN,再和当前行A值相乘 df['C'] = df['A'] * df['A'].take(pos, allow_fill=True).values # 若需将无效位置的NaN替换为自定义默认值(比如0),可补充以下代码 # df['C'] = df['C'].fillna(0)
如果需要用B列的值作为rolling的窗口大小实现可变窗口计算(要求pandas版本≥1.3.0),示例如下:
# 以B列值为窗口大小,计算A列的移动均值,min_periods设置为1避免小窗口返回NaN df['rolling_mean'] = df['A'].rolling(window=df['B'].to_numpy(), min_periods=1).mean()
内容的提问来源于stack exchange,提问作者Jane Doe
相关产品推荐
相关产品推荐

