2016-10-04 11 views
1

を溶融した後:私は抽出行私はパンダで働いていると私は、このテーブルを持っている

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 
... 

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 
... 

と私は、この表を入手したいのですが試してみました:

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 

ただし、表の下部には、「余分な」列と見なすべき情報が含まれています。 これは正しいプロセス/アプローチですか?はいの場合、テーブルの下の部分をサンプルのクラスを含む列に「シフト」するにはどうすればよいですか?

あなたは meltid_varsClassを追加する必要がある

答えて

2

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ともう1つの可能な解決策:

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

パーフェクト!それはまさに私が必要なものです。溶融物を使った最初の解決策が簡単に見つかりました。ありがとう! –

関連する問題