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