#python #pandas #dataframe #matplotlib #seaborn
#python #pandas #фрейм данных #matplotlib #seaborn
Вопрос:
Я пытаюсь отобразить процентное соотношение каждого столбца и сталкиваюсь с ошибкой — IndexError: индекс 3 выходит за пределы оси 0 с размером 3
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline
import seaborn as sns
df = pd.read_csv('https://github.com/Kevin-ck1/Intro-To-Data-Science/raw/master/hotel_bookings.csv')
df_booking = df.copy()
df_booking['percentage'] = round(df_booking['arrival_date_year']/df_booking['arrival_date_year'].sum() * 100, 1)
df_booking['arrival_date_year'].value_counts(dropna=True).plot(kind="bar")
xlocs, xlabs = plt.xticks()
for i, v in enumerate(df_booking['percentage']):
plt.text(xlocs[i] - 0.08, v 25, str(v) '%', fontsize = 15)
plt.title('Booking')
plt.show()
Выдается сообщение об ошибке
IndexError Traceback (most recent call last)
<ipython-input-59-07b4659a45f8> in <module>()
21 for i, v in enumerate(df_booking['percentage']):
22
---> 23 plt.text(xlocs[i] - 0.08, v 25, str(v) '%', fontsize = 15)
24
25 plt.title('Booking')
IndexError: index 3 is out of bounds for axis 0 with size 3
Комментарии:
1. Пожалуйста, отредактируйте свой пост и вставьте весь свой код
2. Все проценты в столбце равны 0. Кроме того, вы пытаетесь аннотировать 3 столбца значениями 119390 из столбца.
3. @TrentonMcKinney на выходе отображается ноль, но это не должно быть фактическим значением… Его должно быть 100, разделенное на три значения
Ответ №1:
Работая над вашим текущим кодом, имеет смысл сохранить подсчеты, затем вычислить процент, а затем добавить тики, используя проценты:
counts = df['arrival_date_year'].value_counts(dropna=True)
perc = round(100*counts/counts.sum(),1).to_numpy()
counts.plot(kind="bar")
xlocs, xlabs = plt.xticks()
for i in range(len(da)):
plt.text(xlocs[i] - 0.08, counts.iloc[i] 25, str(perc[i]) '%', fontsize = 10)
plt.title('Booking')
plt.show()