我正在和熊猫一起工作,我有这张桌子:
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
除了表的底部包含应被视为“额外”列的信息。 这是正确的流程/方法吗?如果是,我怎样才能将表格的底部“移动”为包含我的样本类的列?
答案 0 :(得分:2)
您需要在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