我想“展平”一个现有的数据框并遇到Pandas melt()
命令。这似乎是这里选择的武器,但是这种行为有点出乎意料(至少对我而言)。让我们从一个相当纯真的MultiIndex DataFrame开始:
df = pd.DataFrame(np.random.randn(6, 6),
index=pd.MultiIndex.from_arrays([['X','X','X','Y','Y','Y'],
['x','y','z','x','y','z']],
names=['omega1', 'omega2']),
columns=pd.MultiIndex.from_arrays([['A','A','A','B','B','B'],
['a','b','c','a','b','c']],
names=['alpha1', 'alpha2']))
提供一个不错的DataFrame,如:
alpha1 A ... B
alpha2 a b ... b c
omega1 omega2 ...
X x 2.362954 0.015595 ... 1.273841 -0.632132
y -0.134122 1.791614 ... 1.101646 -0.181099
z 0.410267 1.063625 ... -1.483590 0.521431
Y x 0.001779 -0.076198 ... -1.395494 1.177853
y 0.453172 1.899883 ... 1.116654 -2.209697
z 1.636227 -0.999949 ... 0.800413 -0.431485
当我现在df.melt()
时,我得到的是这样的:
alpha1 alpha2 value
0 A a 2.362954
1 A a -0.134122
2 A a 0.410267
3 A a 0.001779
...
33 B c 1.177853
34 B c -2.209697
35 B c -0.431485
但是我更期待这样的事情:
omega1 omega2 alpha1 alpha2 value
0 X x A a 2.362954
1 X y A a -0.134122
2 X z A a 0.410267
3 Y x A a 0.001779
...
33 Y x B c 1.177853
34 Y y B c -2.209697
35 Y z B c -0.431485
确切的顺序无关紧要,但是如果列名和行名保持不变,那就很好了。 我无法让Pandas正确返回索引。我在做什么错??
答案 0 :(得分:3)
您需要reset_index
索引,并在melt
中以索引名称传递
df.reset_index().melt(['omega1','omega2'])