2015-04-23 72 views
0

我試圖通過將行數據的'窗口'轉換爲列數據來重塑數據框。例如,爲2的窗口大小,給出的數據幀:大熊貓長窗寬

A B 
0 a1 b1 
1 a2 b2 
2 a3 b3 
3 a4 b4 

我想以產生數據幀:

A1 A2 B1 B2 
0 a1 a2 b1 b2 
1 a2 a3 b2 b3 
2 a3 a4 b3 b4 

這是棘手的,因爲在舊數據幀的小區在生成的數據框中可能沒有唯一索引。

我當然可以做一些複雜的事情,比如迭代舊數據框中的行,計算新單元格的位置,並簡單地複製數據。但我想要一個更簡單的解決方案...

回答

0

您可以查看窗口大小爲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 
+0

非常好!經過進一步的反思,我的問題實際上需要將窗口函數應用到原始數據框中的每一行,而將NaN留在下面沒有值的地方。這可以簡單地通過除去串聯結果上的.iloc調用來實現。 –