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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:57:03