您可以查看窗口大小爲2的操作,將DataFrame向上移動一行,將其與原始DataFrame水平連接,最後重新排序。因此,如果不遍歷行是可以做到這樣的:
res = df.merge(df.shift(-1), left_index=True, right_index=True).iloc[:-1]
res.columns = ['A1', 'B1', 'A2', 'B2']
res = res[['A1', 'A2', 'B1', 'B2']]
print res
輸出:
A1 A2 B1 B2
0 a1 a2 b1 b2
1 a2 a3 b2 b3
2 a3 a4 b3 b4
這可以推廣到任意數據幀和窗口大小:
def rolling(df, window_size=2):
dfs = [df]
for i in range(1, window_size):
dfs.append(df.shift(-i))
res = pd.concat(dfs, axis=1).iloc[:-(window_size-1)]
colnames = [c + str(i) for i in range(1, window_size+1) for c in df.columns]
reorder = [c + str(i) for c in df.columns for i in range(1, window_size+1)]
res.columns = colnames
return res[reorder]
print rolling(df, 3)
輸出:
A1 A2 A3 B1 B2 B3
0 a1 a2 a3 b1 b2 b3
1 a2 a3 a4 b2 b3 b4
非常好!經過進一步的反思,我的問題實際上需要將窗口函數應用到原始數據框中的每一行,而將NaN留在下面沒有值的地方。這可以簡單地通過除去串聯結果上的.iloc調用來實現。 –