我有一个多索引的pandas.Dataframe,它是这样的:
BAZ PAL
Foo Bar
124 1 A B
2 C D
134 1 E F
2 G H
我需要以适当的方式将index中的level-one与列交换。我需要最终得到这样的东西:
124 134
Coo Bar
BAZ 1 A E
2 C G
PAL 1 B F
2 D H
答案 0 :(得分:2)
您需要将现有索引级别Foo
取消堆叠,堆叠所需的列' Coo',然后重新排列索引级别。交换索引级别后,您可能希望对其进行排序。最后,您可能希望删除所有值的列名(val
)。
df = (pd.DataFrame({'Foo': [124, 124, 134, 134] * 2,
'Bar': [1, 2, 1, 2] * 2,
'Coo': ['BAZ'] * 4 + ['PAL'] * 4,
'val': list('ACEGBDFH')})
.set_index(['Foo', 'Bar', 'Coo'])
.unstack('Coo'))
>>> df
val
Coo BAZ PAL
Foo Bar
124 1 A B
2 C D
134 1 E F
2 G H
df = df.unstack('Foo').stack('Coo')
df.index = df.index.swaplevel(0, 1)
>>> df
val
Foo 124 134
Coo Bar
BAZ 1 A E
PAL 1 B F
BAZ 2 C G
PAL 2 D H
df.sort_index(inplace=True)
>>> df
val
Foo 124 134
Coo Bar
BAZ 1 A E
2 C G
PAL 1 B F
2 D H
df.columns = df.columns.droplevel()
>>> df
Foo 124 134
Coo Bar
BAZ 1 A E
2 C G
PAL 1 B F
2 D H