Pandas 中的可变移位

Variable shift in Pandas

数据框中有两列 A 和 B:

   A   B
0  1   6
1  2   7
2  1   8
3  2   9
4  1  10

我想创建一个 C 列。C 的 B 值必须按 A 的值移动:

   A   B   C 
0  1   6 NaN
1  2   7 NaN
2  1   8   7
3  2   9   7
4  1  10   9

命令:

df['C'] = df['B'].shift(df['A'])

不起作用。 您还有其他想法吗?

由于索引对齐,这很棘手,您可以在 df 上定义用户 func 和 apply row-wise,这里该函数将对 B 列执行移位,return移位列的索引值(使用 .name 属性 return 索引):

In [134]:    
def func(x):
    return df['B'].shift(x['A'])[x.name]
df['C'] = df.apply(lambda x: func(x), axis=1)
df

Out[134]:
   A   B    C
0  1   6  NaN
1  2   7  NaN
2  1   8  7.0
3  2   9  7.0
4  1  10  9.0

我会使用 numpy 的帮助来避免 apply

l = np.arange(len(df)) - df.A.values
df['C'] = np.where(l >=0, df.B.values[l], np.nan)
df

   A   B    C
0  1   6  NaN
1  2   7  NaN
2  1   8  7.0
3  2   9  7.0
4  1  10  9.0

简单时间测试