2016-10-04 105 views
1

我與熊貓的工作,我有這個表:提取行從熊貓的數據幀列融化後

ID 1-May-2016 1-Jun-2016 20-Jul-2016 Class 
1  0.2  0.52  0.1  H 
2  0.525  0.20  0.01  L 
... 

,我想獲得該表:

ID Date  Value Class 
1 1-May-2016 0.2 H 
1 1-Jun-2016 0.52 H 
... 
2 1-May-2016 0.525 L 
... 

我嘗試:

pandas.melt(df,id_vars["ID"], var_name = "Class") 

,我幾乎得到我想要什麼:

ID Class  Value 
1 1-May-2016 0.2 
1 1-Jun-2016 0.52 
... 
1 Class   L 
2 Class   H 

除了表格的底部包含應該被視爲「額外」列的信息。 這是正確的過程/方法嗎?如果是,我怎樣才能將表格的底部「轉移」爲包含我樣本類別的列?

回答

2

您需要melt添加Classid_vars

print (pd.melt(df,id_vars=["ID", 'Class'], var_name = "Date", value_name='Vals')) 
    ID Class   Date Vals 
0 1  H 1-May-2016 0.200 
1 2  L 1-May-2016 0.525 
2 1  H 1-Jun-2016 0.520 
3 2  L 1-Jun-2016 0.200 
4 1  H 20-Jul-2016 0.100 
5 2  L 20-Jul-2016 0.010 

如果必要的話,然後使用sort_values

print (pd.melt(df,id_vars=["ID", 'Class'], var_name = "Date", value_name='Vals') 
     .sort_values(['ID', 'Class'])) 

    ID Class   Date Vals 
0 1  H 1-May-2016 0.200 
2 1  H 1-Jun-2016 0.520 
4 1  H 20-Jul-2016 0.100 
1 2  L 1-May-2016 0.525 
3 2  L 1-Jun-2016 0.200 
5 2  L 20-Jul-2016 0.010 

stack另一種可能的解決方案:

print (df.set_index(["ID", 'Class']) 
     .stack() 
     .reset_index(name='Vals') 
     .rename(columns={'level_2':'Date'})) 

    ID Class   Date Vals 
0 1  H 1-May-2016 0.200 
1 1  H 1-Jun-2016 0.520 
2 1  H 20-Jul-2016 0.100 
3 2  L 1-May-2016 0.525 
4 2  L 1-Jun-2016 0.200 
5 2  L 20-Jul-2016 0.010 
+0

完美!這正是我需要的。我發現融化更簡單的第一個解決方案。謝謝! –