我有一個粗略格式的熊貓數據框print(df) Time GroupA GroupB Value1 Value20 100.0 1.0 1.0 18.0 0.01 100.0 1.0 2.0 16.0 0.02 100.0 2.0 1.0 18.0 0.03 100.0 2.0 2.0 10.0 0.0其中Time是一個計數變量/時間戳,GroupA和GroupB是類別,以及Value1和Value2是數值量。此代碼段創建了一個模型數據框:import numpy as npvalues = np.zeros(shape=(4,5))values[:,0] = 100values[:,1] = [1]*2 + [2]*2values[:,2] = [1,2]*2values[:,3] = np.random.randint(low=10,high=20,size=(4))df = pd.DataFrame(values,columns=['Time','GroupA','GroupB','Value1','Value2'])加載一些數據后,我想計算并填寫Value2. 當它發生時(順便說一句,因為Value2是Value1每個現有 ( GroupA, GroupB) 對中的時間序列函數),我發現通過首先將我的數據轉換為以下形式來計算這些值最容易:df_pivot = df.pivot_table(index='Time',columns=['GroupA','GroupB'],values=['Value1','Value2'], fill_value=0.0)然后在一些不相關的代碼之后我填寫了值print(df_pivot) Value1 Value2 GroupA 1.0 2.0 1.0 2.0 GroupB 1.0 2.0 1.0 2.0 1.0 2.0 1.0 2.0Time 100.0 13 16 16 10 27 20 28 20現在我想將其“反透視”為df. 我可以通過循環df、查找 中的值df_pivot并填充它來手動執行此操作,但我更喜歡使用內置函數。嘗試使用 的變體時df.melt,由于df_pivot的分層列存在問題,我無法執行此反轉。我最好的嘗試是dfm = df_pivot.reset_index().melt(id_vars="Time")dfm.columns.values[1] = "HACK"dfm = dfm.pivot_table(index=["Time","GroupA","GroupB"],columns="HACK",values="value").reset_index()產生數據框print(dfm)HACK Time GroupA GroupB Value1 Value20 100.0 1.0 1.0 13 271 100.0 1.0 2.0 16 202 100.0 2.0 1.0 16 283 100.0 2.0 2.0 10 20這有效,但并不讓我覺得是最好的解決方案,或者非常便攜(為什么melt會產生“NaN”列名?為什么我要手動查找該列的索引并重命名它?為什么我必須樞軸以撤消樞軸?)雖然嘗試并查看文檔和示例以尋找替代方案,但我不知所措。該melt函數有一個col_level看起來應該有幫助的參數,但我為此使用的任何有效值只會導致數據丟失(丟失“時間”、“組 A”或“組 B”數據)。
1 回答

湖上湖
TA貢獻2003條經驗 獲得超2個贊
我認為stack更直接
df_pivot.stack([1,2]).reset_index()
Out[8]:
Time GroupA GroupB Value1 Value2
0 100.0 1.0 1.0 13 0
1 100.0 1.0 2.0 13 0
2 100.0 2.0 1.0 12 0
3 100.0 2.0 2.0 11 0
添加回答
舉報
0/150
提交
取消