#python #matplotlib #seaborn #categorical-data
#python #matplotlib #сиборн #категориальный-данные
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом:
categorical_1 categorical_2 categorical_3 ... dummy
A YY DDDE 0
A ZZ EEFG 0
B ZZ DDDE 1
C YY DDDE 1
A XX EEFG 0
.
.
.
Я хочу составить графики среднего значения фиктивного столбца по оси y и категорий по оси x. Обычно я бы сделал что-то вроде этого:
df.groupby("categorical_1")["dummy"].mean().plot(kind="bar")
Однако столбцов слишком много, и я не знаю, как это сделать для всех из них. Есть ли простой способ сделать это?
Я знаю, что для числовых переменных мы могли бы сделать что-то вроде этого:
#scatterplot
sns.set()
cols = ['column1', 'column2',...,'columnn']
sns.pairplot(df[cols], size = 2.5)
Но я не уверен, что делать с категориальными переменными
Ответ №1:
Есть несколько возможностей, о которых я могу подумать.
Во-первых, вы можете использовать seaborn, но вам нужно изменить формат вашего фрейма данных. Проблема с этим решением заключается в том, что все уровни оттенков отображаются на каждом уровне x.
df2 = df.melt(id_vars=['dummy'], value_vars=cols)
plt.figure()
sns.barplot(data=df2, x='variable', y='dummy', hue='value')
Или вы можете использовать pandas и выполнять итерации по столбцам, но тогда будет проще создать один подзаголовок для каждого столбца:
cols = df.columns[df.columns.str.startswith('categorical')]
target_col = 'dummy'
height = 2
width = 2
n_cols = len(cols)
fig, axs = plt.subplots(1,n_cols, figsize=(n_cols*width,height), gridspec_kw={'wspace':0}, sharey=True)
for col,ax in zip(cols,axs):
df.groupby(col)[target_col].mean().plot(kind="bar", ax=ax)
plt.tight_layout()