Я воссоздал фиктивную версию вашего набора данных:
import numpy as np
import pandas as pd
dictionary = {'Banner':['Type1']*10+['Type2']*10,
'Northen_californina':np.random.rand(20),
'Texas':np.random.rand(20)}
df = pd.DataFrame(dictionary)
Вам нужно только растопить ваш фрейм данных (unpivot), чтобы информация о географической зоне сохранялась в столбце, а не как имя столбца Вы можете использовать метод pandas .melt и указать все столбцы, которые вы хотите поместить в свой блок-блок, в аргументе value_vars.
С моим фиктивным набором данных вы можете сделать это:
df = pd.melt(df,id_vars=['Banner'],value_vars=['Northen_californina','Texas'],
var_name='zone', value_name='amount')
Теперь вы можете применить блокпост, используя аргумент оттенка:
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(9,9)) #for a bigger image
sns.boxplot(x="Banner", y="amount", hue="zone", data=df, palette="Set1")