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

如何将DataFrame其他列的值作为df.shift()方法的偏移参数

问题原因

pandas原生的shift()方法仅支持传入固定数值作为全局统一偏移量,不支持传入列序列实现逐行动态偏移,直接传入df['shift']作为参数无法得到逐行匹配的计算结果。

正确实现方法

通用易读写法(适合中小数据量)

通过逐行索引匹配取值即可实现需求,代码如下:

import numpy as np

# 逐行计算偏移后对应位置的gg值
df['gg_shift'] = df.apply(
    lambda row: df['gg'].loc[row.name - row['shift']] if row.name - row['shift'] >= 0 else np.nan,
    axis=1
)
# 按示例规则,shift值为0的行gg_shift留空
df.loc[df['shift'] == 0, 'gg_shift'] = np.nan

运行后得到的结果和给出的预期表完全一致。

高性能写法(适合百万行级大数据量)

如果数据量较大,apply逐行循环效率偏低,可以用numpy数组做向量化计算,速度可提升10~100倍:

import numpy as np

# 转换为numpy数组做向量化计算
gg_arr = df['gg'].to_numpy()
shift_arr = df['shift'].to_numpy()
target_idx = df.index.to_numpy() - shift_arr

# 初始化结果数组,默认填充空值
res = np.full(len(df), np.nan)
# 仅对索引合法(>=0)且shift值不为0的位置赋值
valid_mask = (target_idx >= 0) & (shift_arr != 0)
res[valid_mask] = gg_arr[target_idx[valid_mask]]

df['gg_shift'] = res

内容的提问来源于stack exchange,提问作者junyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:27:17