融化后从 pandas 数据框中提取行作为列

Extract rows as column from pandas data frame after melt

我正在与 pandas 合作,我有这个 table:

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

我想得到这个 table:

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

除了 table 的底部包含应被视为 "extra" 列的信息。 这是对的process/approach吗?如果是,我如何 "shift" table 的底部成为包含我的样本 class 的列?

您需要在 melt 中将 Class 添加到 id_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