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 mean max
species
setosa 1.0 1.462 1.9
versicolor 3.0 4.260 5.1
virginica 4.5 5.552 6.9

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