我们从这些数据开始:
import numpy as np
import pandas as pd
data=pd.DataFrame(data=np.random.rand(10,5),columns=['headA','headB','tailA','tailB','tailC'])
现在我想执行某个取消堆叠操作,仅取消堆叠最后三列。因此,这应该是新索引:
pd.MultiIndex.from_product([data.columns[-3:],data.index])
MultiIndex([('tailA', 0),('tailA', 1),('tailA', 2),('tailA', 3),('tailA', 4),('tailA', 5),('tailA', 6),('tailA', 7),('tailA', 8),('tailA', 9),('tailB', 0),('tailB', 1),('tailB', 2),('tailB', 3),('tailB', 4),('tailB', 5),('tailB', 6),('tailB', 7),('tailB', 8),('tailB', 9),('tailC', 0),('tailC', 1),('tailC', 2),('tailC', 3),('tailC', 4),('tailC', 5),('tailC', 6),('tailC', 7),('tailC', 8),('tailC', 9)],)
我认为,要执行此操作,我必须将前两列放入与其余三列不同的级别中。我不知道如何以优雅的方式做到这一点。有什么建议吗?
您可以使用 melt
ignore_index=False
,然后使用 set_index
append=True
: 将新变量列设置为索引
out = (data.melt(data.columns[:-3], ignore_index=False, var_name='tail')
.set_index('tail', append=True).swaplevel()
)
输出:
headA headB value
tail
tailA 0 0.587533 0.472803 0.650371
1 0.465910 0.384050 0.623001
2 0.376165 0.724400 0.741483
3 0.589693 0.243686 0.833794
4 0.695016 0.808199 0.599436
5 0.976881 0.594713 0.315471
6 0.599184 0.263577 0.701009
7 0.524138 0.786585 0.975606
8 0.030385 0.903692 0.722221
9 0.175104 0.600267 0.830920
tailB 0 0.587533 0.472803 0.031079
1 0.465910 0.384050 0.693012
2 0.376165 0.724400 0.455640
3 0.589693 0.243686 0.331427
4 0.695016 0.808199 0.971165
5 0.976881 0.594713 0.277134
6 0.599184 0.263577 0.720298
7 0.524138 0.786585 0.786354
8 0.030385 0.903692 0.701858
9 0.175104 0.600267 0.854581
tailC 0 0.587533 0.472803 0.991319
1 0.465910 0.384050 0.167928
2 0.376165 0.724400 0.336915
3 0.589693 0.243686 0.193647
4 0.695016 0.808199 0.877337
5 0.976881 0.594713 0.026955
6 0.599184 0.263577 0.138335
7 0.524138 0.786585 0.727579
8 0.030385 0.903692 0.087960
9 0.175104 0.600267 0.578285