Я не понимаю, почему один код работает, а другой нет

Я попытался сопоставить некоторые домашние задания и результаты викторины, и у меня есть два набора кода, которые для меня достаточно похожи, но один создает две гистограммы рядом, а другой - нет.

Я запускаю свой код в среде Anaconda python 3.6 в Windows. Следующий код установит проблему

    data = pd.DataFrame( np.random.uniform(low = 0.0, high = 100, size = (224,3)))
    data.columns = ['Section', 'hw_score', 'quiz_score']

    data['Section'] = data['Section'].apply(get_section)
    data.head(10)


    data['hw_score'].fillna(0,inplace=True)
    data['quiz_score'].fillna(0,inplace=True)
    data.isnull().sum()

    data.hw_score[ data.hw_score > 0 ].hist( bins = [0,10,20,30,40,50,60,70,80,90,100] )

    data.quiz_score[data.quiz_score > 0].hist( bins = [0,10,20,30,40,50,60,70,80,90,100] )

Я не уверен, почему следующий код не создает гистограммы, расположенные рядом:

plt.figure( figsize = (15,6) )
plt.subplot(1,2,1)
fig = data.hist(column='hw_score')
fig.set_title('Homework Score')

plt.subplot(1,2,2)
fig = data.hist(column='quiz_score')
fig.set_title('Quiz Score')

и следующее:

plt.figure( figsize = (15,6) )
plt.subplot(1,2,1)
fig = data.hw_score[ data.hw_score > 0 ].hist( bins = [0,10,20,30,40,50,60,70,80,90,100] )
fig.set_title('Homework Score')

plt.subplot(1,2,2)
fig = data.quiz_score[data.quiz_score > 0].hist( bins = [0,10,20,30,40,50,60,70,80,90,100] )
fig.set_title('Quiz Score')

person tstl    schedule 22.04.2019    source источник
comment
как определяется эта функция get_section?   -  person âńōŋŷXmoůŜ    schedule 22.04.2019
comment
@âńōŋŷXmoůŜ не имеет значения, просто удалите эту строку, он не использует ее в проблемном участке кода   -  person Charles Landau    schedule 22.04.2019


Ответы (1)


В вашем ошибочном коде fig представляет собой массив numpy, где нулевой элемент является объектом AxesSubplot. Документы pandas предупреждают об этом.

Он также говорит вам, что вы можете передать ax непосредственно в pandas.DataFrame.hist, который мы можем отредактировать в вашем коде осечки следующим образом:

fig = plt.figure( figsize = (15,6) )
ax = fig.add_subplot(1,2,1)
data.hist(column='hw_score', ax=ax)
ax.set_title('Homework Score')

ax = fig.add_subplot(1,2,2)
data.hist(column='quiz_score', ax=ax)
ax.set_title('Quiz Score')

plt.show()

Обратите внимание на изменения: fig теперь фактическая фигура, ax оси. Возвращаемый тип data.hist — это пустой массив осей, но нам это не нужно, и мы можем решить не хранить его где-либо.

EDIT: Итак, вы спросили, почему ДЕЙСТВИТЕЛЬНО работает другой блок кода. Короче говоря, это потому, что разработчики pandas любят реализовывать методы как для pandas.DataFrame, так и для pandas.Series. Итак, когда вы звоните:

fig = data.hw_score[ data.hw_score > 0 ].hist( bins = [0,10,20,30,40,50,60,70,80,90,100] )

data.hw_score[ data.hw_score > 0 ] это pandas.Series. Просмотрите документы. для pandas.Series.hist нет предупреждений о том, что иногда возвращается массив numpy, как в случае с pandas.DataFrame.hist.

Поскольку он не возвращает объект, заключенный в массив, нам не нужно предпринимать никаких специальных мер для доступа к объекту AxesSubplot.

person Charles Landau    schedule 22.04.2019
comment
Благодарю вас! Почему не появляется та же ошибка, когда вместо этого я использую последний набор кода? - person tstl; 23.04.2019
comment
Немного сложно ответить в комментарии, поэтому я отредактировал свой ответ @Skylar.Trigueiro - person Charles Landau; 23.04.2019