我有一个Pandas数据框,其中有一列数字,类似于:
id - val
0 - 100
1 - 200
2 - 100
3 - 400
4 - 300
5 - 100
etc
我想做的是添加第二列,它是前三行中的值的列表/ numpy数组:
id - val - val_list
0 - 100 - [] # Or [NaN, NaN, NaN]
1 - 200 - [100] # Or [NaN, NaN, 100]
2 - 100 - [100, 200] # Or [NaN, 100, 200]
3 - 400 - [100, 200, 100]
4 - 300 - [200, 100, 400]
5 - 100 - [100, 400, 300]
etc
有什么想法如何有效地解决此问题,最好不要循环吗?
答案 0 :(得分:3)
首先,我认为在熊猫中使用list
并不是good idea,如果可能的话,最好在此处使用2d numpy数组。
如果性能很重要,请使用strides
:
N = 3
x = np.concatenate([[np.nan] * (N), df['val'].values])
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
arr = rolling_window(x, N)
df['val_list'] = arr[:-1].tolist()
print (df)
id val val_list
0 0 100 [nan, nan, nan]
1 1 200 [nan, nan, 100.0]
2 2 100 [nan, 100.0, 200.0]
3 3 400 [100.0, 200.0, 100.0]
4 4 300 [200.0, 100.0, 400.0]
5 5 100 [100.0, 400.0, 300.0]
答案 1 :(得分:2)
您好,请使用以下简单代码。
df = pd.DataFrame([100,200,100,400,300,100],columns =['Val'])
temp = pd.concat([df.shift(3),df.shift(2),df.shift(1)],axis=1)
df['val_list'] = temp.apply(lambda x:x.tolist(),axis=1)
#
df = pd.DataFrame([100,200,100,400,300,100],columns =['Val'])
N=3
temp = pd.DataFrame()
for i in range(N,0,-1):
temp = pd.concat([temp,df.shift(i)],axis=1)
df['val_list'] = temp.apply(lambda x:x.tolist(),axis=1)