如何将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
相关产品推荐
相关产品推荐

