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
简单时间测试
数据框中有两列 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
简单时间测试