Каков наилучший способ перебирать столбцы pandas для генерации гистограмм?

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

Я пытаюсь перебрать все столбцы во фрейме данных под названием «Структура.DF» и сгенерируйте график гистограммы для каждого столбца.

 #This is a summary of columns

Struct_DF.columns

Index(['ID', 'lh_BA1_ExV_Area', 'lh_BA2_ExV_Area', 'lh_BA3a_ExV_Area',
   'lh_BA3b_ExV_Area', 'lh_BA4a_ExV_Area', 'lh_BA4p_ExV_Area',
   'lh_BA6_ExV_Area', 'lh_BA44_ExV_Area', 'lh_BA45_ExV_Area',
   ...
   'R_presubiculum_Vol_Adj', 'R_parasubiculum_Vol_Adj',
   'R_molecular_layer_HP_Vol_Adj', 'R_GC_ML_DG_Vol_Adj', 
'R_CA3_Vol_Adj',
   'R_CA4_Vol_Adj', 'R_fimbria_Vol_Adj', 'R_HATA_Vol_Adj',
   'R_Whole_hippocampus_Vol_Adj', 'eTIV'],
  dtype='object', length=735)

# Check for normalcy of distribution of each variable.

# Set the column names

columns= Struct_DF.columns

# Loop over all columns
#using 2x2 matrix representation of histrogram specified by firs two 
#digits of subplot index and third index specifies the plot number (eg. #221)

i = 221
for col in columns:
    plt.subplot(i)
    plt.hist(Struct_DF[col])
    i =1
  

Я получаю следующее сообщение об ошибке:

 ValueError: num must be 1 <= num <= 4, not 5
  

Есть ли способ генерировать эти графики параллельно?

Примечание: вопрос был отредактирован на основе предложенного ответа.

Ответ №1:

Struct_DF.col эквивалентно Struct_DF['col'] вот почему вы получаете сообщение об ошибке, столбца нет 'col' , то, что вы хотите сделать, это Struct_DF[col]

Для построения гистограмм вы можете сделать:

 fig, axs = plt.subplots(len(df.columns), figsize=(5, 25))
for n, col in enumerate(df.columns):
    df[col].hist(ax=axs[n])
  

Если вы хотите использовать сетку 2×2, вы можете вместо этого поступить следующим образом, но вам нужно указать 4 столбца, которые вы хотите отобразить:

 cols_to_plot = ['lh_BA4a_ExV_Area', 'lh_BA4p_ExV_Area',
   'lh_BA6_ExV_Area', 'lh_BA44_ExV_Area']


fig, axs = plt.subplots(2, 2)
for n, col in enumerate(cols_to_plot):
    i, j = [int(l) for l in "{0:02b}".format(n)]
    df[col].hist(ax=axs[i][j])
  

Вы также можете использовать ax[i].hist(df[col]) вместо df[col].hist(ax=ax[i]) или:

 for i in range(4):
    plt.subplot(2, 2, i)
    plt.hist(df[cols_to_plot[i]])
  

Комментарии:

1. Спасибо! Использование предложенного вами синтаксиса ускоряет цикл, однако при построении графика он выдает ошибки. Я получаю следующую ошибку: ValueError: num должно быть 1 <= num <= 4, а не 5. Вы знаете, есть ли способ настроить, чтобы графики располагались рядом?

2. @dzang был прав. Я отредактировал свой вопрос, основываясь на его полезном предложении.