融化后从 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
我正在与 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