2016-12-30 70 views
4

我有一個熊貓數據幀與16列和2行(SEC01到sec16和x_data,y_data)如何將數據幀的格式轉換從兩行單挑

我想這跟1轉換爲另一種數據幀行32列(x_sec01,y_sec01到x_sec16,y_sec16)

 sec01 sec02 sec03 sec04 sec05 sec06 sec07 sec08 sec09 sec10 sec11 sec12 sec13 sec14 sec15 sec16 
x_data -0 -0 -0 -0 -0 -0 -0 -0 -0 0 0 0 0.557336 0.604719 0.733460 1.019466 
y_data 0 0 0 0 0 0 0 0 0 0 0 0 3.212005 2.692938 2.650384 3.085967 

這可怎麼用最簡單的方式做了什麼?

回答

2

重建與pd.DataFrame和重塑底層數組

pd.DataFrame(
    df.values.T.reshape(1, -1), 
    columns=['{}_{}'.format(r, c) 
      for c in df.columns.tolist() 
      for r in df.index.str[0].tolist()]) 

enter image description here

+0

謝謝主席先生,你是一個真正的天才。 我想這是格式x_sec01,y_sec01,x_sec02,y_sec02哪一部分我需要改變呢? – thirteenmac

+0

@thirteenmac我相信我已經做了編輯。 – piRSquared

+0

哦,明白了,它工作的很棒! – thirteenmac

2

可以首先從index創建MultiIndexunstack

df.index = df.index.str.split('_', expand=True) 
df1 = df.unstack(0) 
df1.columns = ['_'.join((x[1], x[0])) for x in df1.columns] 
print (df1) 
     x_sec01 y_sec01 x_sec02 y_sec02 x_sec03 y_sec03 x_sec04 y_sec04 \ 
data  0  0  0  0  0  0  0  0 

     x_sec05 y_sec05 ...  x_sec12 y_sec12 x_sec13 y_sec13 \ 
data  0  0 ...   0  0 0.557336 3.212005 

     x_sec14 y_sec14 x_sec15 y_sec15 x_sec16 y_sec16 
data 0.604719 2.692938 0.73346 2.650384 1.019466 3.085967 

[1 rows x 32 columns] 

concat另一種解決方案:

df1 = pd.concat([df.loc['x_data'],df.loc['y_data']],keys=('x', 'y')).to_frame().sort_index(1) 
df1.index = ['_'.join(x) for x in df1.index] 
print (df1.T) 
    x_sec01 y_sec01 x_sec02 y_sec02 x_sec03 y_sec03 x_sec04 y_sec04 \ 
0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0 

    x_sec05 y_sec05 ...  x_sec12 y_sec12 x_sec13 y_sec13 x_sec14 \ 
0  0.0  0.0 ...   0.0  0.0 0.557336 3.212005 0.604719 

    y_sec14 x_sec15 y_sec15 x_sec16 y_sec16 
0 2.692938 0.73346 2.650384 1.019466 3.085967 

[1 rows x 32 columns] 
1

解決方案的關鍵在於使用numpy.reshape通過提供類似Fortran的索引排序(order='F')來獲取所需形狀的數據。

之後,它只是通過使用numpy.dstack深度方式堆疊索引和列標籤獲得的DF的標題進行格式化。

idx = df.index.str[0] 
col = df.columns 
head = np.dstack(('{}_'.format(idx[0]) + col, '{}_'.format(idx[1]) + col)).ravel() 
pd.DataFrame(df.values.reshape(1, 32, order='F'), columns=head) 

產生以下輸出:

x_sec01 y_sec01 x_sec02 y_sec02 x_sec03 y_sec03 x_sec04 y_sec04 \ 
0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0 

    x_sec05 y_sec05 ...  x_sec12 y_sec12 x_sec13 y_sec13 x_sec14 \ 
0  0.0  0.0 ...   0.0  0.0 0.557336 3.212005 0.604719 

    y_sec14 x_sec15 y_sec15 x_sec16 y_sec16 
0 2.692938 0.73346 2.650384 1.019466 3.085967 

[1 rows x 32 columns] 
相關問題