2012-12-24 152 views
1

一個數據幀我怎樣才能重塑這個數據幀與熊貓重塑與大熊貓

id | col1 | col2 | col3  | value 
----------------------------------- 
1 | A1 | B1 | before | 20  
2 | A1 | B1 | after | 13 
3 | A1 | B2 | before | 11 
4 | A1 | B2 | after | 21 
5 | A2 | B1 | before | 18 
6 | A2 | B1 | after | 22 

...成以下格式?

col1 | col2 | before | after 
------------------------------- 
A1 | B1 | 20  | 13 
A1 | B2 | 11  | 21 
A1 | B1 | 18  | 22 

編輯:在第二個表的最後一行中的A1應該是A2。

由於數據是成對的(例如,「之前」和「之後」),我需要列沒有'NAs'對齊。

df.pivot(index='col1', columns='col3', values='value') 

不起作用,因爲col1不會產生唯一索引。我可以創建一個額外的列,這將導致獨特。這是唯一的方法嗎?

回答

0

你想要什麼col1和COL2看你轉動後是怎樣的?您的示例輸出顯示A1和B1的最後一行但既不與18和22相關聯的I具有幾個選項的那些值的:

In [234]: tmp = DataFrame(
    {'id':[1,2,3,4,5,6], 
    'col1':['A1','A1','A1','A1','A2','A2'], 
    'col2':['B1','B1','B2','B2','B1','B2'], 
    'col3':['before','after','before','after','before','after'], 
    'value':[20,13,11,21,18,22]}, 
    columns=['id','col1','col2','col3','value']) 

選項1:

In [236]: pivoted = pd.pivot_table(tmp, values='value', 
             rows=['col1','col2'], 
             cols=['col3']) 
In [237]: pivoted 
Out[237]: 
col3  after before 
col1 col2 
A1 B1  13  20 
    B2  21  11 
A2 B1  NaN  18 
    B2  22  NaN 

這並未聽起來不像你想要的那種行爲。

選項2:

In [238]: pivoted = pivoted.fillna(method='bfill').dropna() 
Out[238]: 
col3  after before 
col1 col2 
A1 B1  13  20 
    B2  21  11 
A2 B1  22  18 

In [245]: pivoted.reset_index() 
Out[245]: 
col3 col1 col2 after before 
0  A1 B1  13  20 
1  A1 B2  21  11 
2  A2 B1  22  18 

這也相當接近。再次,我不知道你想如何col1和col2的行爲,但這在列前後有正確的值。

+0

我的問題出錯了。我在我的問題中留下了評論。你的第一個選擇提供了正確的解謝謝。 – Bjoern

0

正如您的矩陣數據所示,col1不能是索引,因爲如您所說,它「不會產生唯一的索引」。

我覺得你最好的最好的是:

grouped = df.groupby('col3') 
pandas.merge(grouped.first(), grouped.last(), on=['col1','col2'])