2015-06-07 219 views
3
df = pd.DataFrame({'BORDER':['GERMANY','FRANCE','ITALY','USA','CANADA','MEXICO','INDIA','CHINA','JAPAN' ], 'ASID':[21, 32, 99, 77,66,55,44,88,111], 'HOUR1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'HOUR2':[3 ,3 ,3, 5 ,5 ,5, 7, 7, 7], 'HOUR3':[8 ,8 ,8, 12 ,12 ,12, 99, 99, 99], 'PRICE1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6], 'PRICE2':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'PRICE3':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6] }) 

df = df[['ASID', 'BORDER', 'HOUR1', 'PRICE1', 'HOUR2', 'PRICE2', 'HOUR3', 'PRICE3']] 

我一直在試圖重塑這個數據幀過去一天。修補堆棧/堆棧/融化和將列轉換爲指示等,但一直未能實現我的目標。重塑熊貓dataframe stack/unstack

所需的輸出具有以下列:

ASID, BORDER, HOUR, PRICE 

我希望將所有的['HOUR1', 'HOUR2', HOUR3']堆疊成一個單一的column = HOUR

同樣,我想將所有['PRICE1', 'PRICE2', 'PRICE3']堆棧在一個單獨的column = PRICE中,使得此字段中的值與HOUR列中的相應值對齊。有一個鏈接HOUR1 & PRICE1,HOUR2 & PRICE2,HOUR3 & PRICE3

我很欣賞你可以提供的任何指導。

回答

2

原始數據(通知更正第二行'PRICE1')。

df = pd.DataFrame({'BORDER':['GERMANY','FRANCE','ITALY','USA','CANADA','MEXICO','INDIA','CHINA','JAPAN' ], 'ASID':[21, 32, 99, 77,66,55,44,88,111], 'HOUR1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'HOUR2':[3 ,3 ,3, 5 ,5 ,5, 7, 7, 7], 'HOUR3':[8 ,8 ,8, 12 ,12 ,12, 99, 99, 99], 'PRICE1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6], 'PRICE2':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'PRICE3':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6] }) 

df = df[['ASID', 'BORDER', 'HOUR1', 'PRICE1', 'HOUR2', 'PRICE2', 'HOUR3', 'PRICE3']] 

首先,將索引ASIDBORDER

df.set_index(['ASID', 'BORDER'], inplace=True) 

然後,爲價格和小時創建兩個DataFrames,堆疊結果。從這些堆疊的數據框中刪除小時和價格水平。

prices = df[['PRICE1','PRICE2', 'PRICE3']].stack() 
prices.index = prices.index.droplevel(2) 
hours = df[['HOUR1', 'HOUR2', 'HOUR3']].stack() 
hours.index = hours.index.droplevel(2) 

最後,連接這兩個數據幀並重命名您的列。

df_new = pd.concat([hours, prices], axis=1) 
df_new.columns = ['HOUR', 'PRICE'] 

>>> df_new 
       HOUR PRICE 
ASID BORDER    
21 GERMANY  2  2 
    GERMANY  3  2 
    GERMANY  8  2 
32 FRANCE  2  2 
    FRANCE  3  2 
    FRANCE  8  2 
99 ITALY  2  2 
    ITALY  3  2 
    ITALY  8  2 
77 USA   4  4 
    USA   5  4 
    USA  12  4 
66 CANADA  4  4 
    CANADA  5  4 
    CANADA  12  4 
55 MEXICO  4  4 
    MEXICO  5  4 
    MEXICO  12  4 
44 INDIA  6  6 
    INDIA  7  6 
    INDIA  99  6 
88 CHINA  6  6 
    CHINA  7  6 
    CHINA  99  6 
111 JAPAN  6  6 
    JAPAN  7  6 
    JAPAN  99  6 
+0

愛它。非常感謝你。欣賞它。 – codingknob