#Flatten multi-index columns in pandas DataFrames
Setup
# Import libraries
import pandas as pd
import seaborn as sns
# Load sample data in a DataFrame
df = (
sns.load_dataset('iris')
[['species', 'petal_length']]
.groupby('species')
.agg(['min', 'mean', 'max'])
)
df| petal_length | |
|---|---|
| min | |
| species | |
| setosa | 1.0 |
| versicolor | 3.0 |
| virginica | 4.5 |
Drop a level
# Just drop the first level
df.droplevel(0, axis=1)| min | mean | max | |
|---|---|---|---|
| species | |||
| setosa | 1.0 | 1.462 | 1.9 |
| versicolor | 3.0 | 4.260 | 5.1 |
| virginica | 4.5 | 5.552 | 6.9 |
Concatenate names
# Method chaining
df.set_axis(['_'.join(col).strip() for col in df.columns.values], axis=1)| petal_length_min | petal_length_mean | petal_length_max | |
|---|---|---|---|
| species | |||
| setosa | 1.0 | 1.462 | 1.9 |
| versicolor | 3.0 | 4.260 | 5.1 |
| virginica | 4.5 | 5.552 | 6.9 |
# Classic way
df.columns = ['_'.join(col).strip() for col in df.columns.values]
df| petal_length_min | petal_length_mean | petal_length_max | |
|---|---|---|---|
| species | |||
| setosa | 1.0 | 1.462 | 1.9 |
| versicolor | 3.0 | 4.260 | 5.1 |
| virginica | 4.5 | 5.552 | 6.9 |