I have a multiindexed pandas.Dataframe which is something like this:
BAZ PAL
Foo Bar
124 1 A B
2 C D
134 1 E F
2 G H
I need to swap level-one from index with columns in appropriate way. I need to end up with something like this:
124 134
Coo Bar
BAZ 1 A E
2 C G
PAL 1 B F
2 D H
Convert the Index to Column using reset_index() Dataframe. reset_index() function to convert the index as a column.
To revert the index of the dataframe from multi-index to a single index using the Pandas inbuilt function reset_index(). Returns: (Data Frame or None) DataFrame with the new index or None if inplace=True.
To change the index values we need to use the set_index method which is available in pandas allows specifying the indexes. where, inplace parameter accepts True or False, which specifies that change in index is permanent or temporary. True indicates that change is Permanent.
Method 2: We can also use the Dataframe. reset_index function to convert the index as a column. The inplace parameter reflects the change in the dataframe to stay permanent.
You need to unstack your existing index level Foo
, stack your desired column 'Coo', and then rearrange the index levels. After swapping your index levels, you probably want to sort it. As a final touch, you may want to drop the column name of all the values (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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With