2015-11-04 25 views
-2

嘗試在4種不同類型的測試(測試A至4)上重構包含4個不同主題(主題1至4)數據的df(6列) D)分別在自己的專欄(第1天到第4天)分4天進行。熊貓 - 將多級df中的縱向數據重構爲單級列

df= pd.DataFrame({'subject': [1, 2, 2, 3,4,1,1,2,3,2], 
        'test': ['A', 'B', 'C', 'D','A', 'B', 'C', 'D','B', 'C'], 
        'Day1': ['X1','X2','X3','X4','X5','X6','X7','X8','X9','X10'], 
        'Day2': ['Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8','Y9','Y10'], 
        'Day3': ['Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10'], 
        'Day4': ['K1','K2','K3','K4','K5','K6','K7','K8','K9','K10']}) 

什麼我的數據幀目前的樣子:

enter image description here

分析我的數據,我想將其重組爲一個單一的長格式「平傳播」 - 每個主題都有隻在一行包含所有觀察結果。

所需結構:

enter image description here

+0

索引(列名和行索引)必須是唯一的,所以這對於您發佈的示例數據來說是不可能的。 例如,「subject = 2」和「test = C」的行出現兩次,這意味着每天都會有兩個不同的值。 –

回答

1

這是不可能的,因爲你大熊貓索引(包括列和行標籤)中提供的示例性數據不能包含重複。數據中的一個示例爲Subject 2test C - 此組合出現兩次,這意味着無法知道哪些值應與相應的日期一起進行。

在,你有獨特的列和行標籤的情況下,你可以使用的melt組合與pivot像這樣:

import pandas as pd 

df = pd.DataFrame({'subject': [1, 2, 2, 3,4,1,1,2,3,2], 
        'test': ['A', 'B', 'C', 'D','A', 'B', 'C', 'D','B', 'C'], 
        'Day1': ['X1','X2','X3','X4','X5','X6','X7','X8','X9','X10'], 
        'Day2': ['Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8','Y9','Y10'], 
        'Day3': ['Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10'], 
        'Day4': ['K1','K2','K3','K4','K5','K6','K7','K8','K9','K10']}) 

melted = pd.melt(df, id_vars=['subject', 'test']) 

melted重塑基於傳遞給它的id_vars的數據。它現在看起來像這樣:

subject test variable value 
0  1 A  Day1 X1 
1  2 B  Day1 X2 
2  2 C  Day1 X3 
3  3 D  Day1 X4 
4  4 A  Day1 X5 

現在您可以創建一個包含您希望作爲列標題的值的新列。 這些必須是唯一的。

melted['col_name'] = 'test' + melted['test'] + '-' + melted['variable'] 

現在melted有適當的值就是我們想要成爲我們在長期的格式標題:

subject test variable value col_name 
0  1 A  Day1 X1 testA-Day1 
1  2 B  Day1 X2 testB-Day1 
2  2 C  Day1 X3 testC-Day1 
3  3 D  Day1 X4 testD-Day1 
4  4 A  Day1 X5 testA-Day1 

pivot會讓我們的方式休息,但在將無法​​正常工作這種情況是因爲標題不是唯一的(再次,Subject 2test C的問題)。

melted.pivot('subject', columns='col_name', values='value') 

如果,例如,DayN行是時間戳,我們可能不會有這個問題。

+0

你是男人,格雷格!這就是我一直在尋找的東西(對列名稱進行了很小的修改)。 –