Гистограмма matplotlib из серии подсчетов значений pandas

Я пытаюсь построить график на питоне, который покажет мне появление элементов с течением времени. Итак, я хочу узнать, сколько предметов, соответствующих двум категориям, появляется в каждом году, и построить график на их основе.

Это мои данные в excel:

Гистограмма matplotlib из серии подсчетов значений pandas

Что я хочу закончить, так это список фильмов, которые являются одновременно фэнтези и боевиками, и сколько раз они появляются в каждом году. Это конечный результат, к которому я пришел (что правильно)

Гистограмма matplotlib из серии подсчетов значений pandas

то есть в 2004 году есть 2 фильма, которые являются одновременно фэнтези и боевиком, и есть один фильм 2005 года, который является одновременно фэнтези и боевиком и т. д.

Вот шаги, которые я предпринял, чтобы получить результат:

#import data:
data = pd.read_csv("data.csv")

#put all fantasy movies in a list:
fantasy_movies = data[['Name', 'Genre']][(data['Genre'] == 'Fantasy')]
fantasy_movies.rename(columns = {'Genre' : 'Fantasy'}, inplace = True)

#put all action movies in a list:
action_movies = data[['Name', 'Genre']][(data['Genre'] == 'Action')]
action_movies.rename(columns = {'Genre' : 'Action'}, inplace = True)

#merge the two datasets:
action_fantasy = pd.merge(fantasy_movies, action_movies)

#obtain a list of unique movie names:
unique = action_fantasy.Name.unique()

#make dates the column and unique names the rows
filter_data = data[(data.Name.isin(unique))] 
table = filter_data.pivot_table(filter_data, index = ['Name'],columns=['year'])

#replace all NaNs with zero
table1 = table.fillna(0)

#Count items in years
table1.gt(0).astype(int).sum(axis=0)

Теперь отсюда я хотел бы сделать какой-то график (я думаю о гистограмме), используя Matplotlib, который будет иметь годы внизу и увеличиваться на сумму в соответствии с результатом table1. Я изо всех сил пытаюсь создать его, хотя технически это должно быть так же просто, как поместить данные в столбец x и данные в столбец y.

Как код из W3 Schools: https://www.w3schools.com/python/matplotlib_bars.asp

x = np.array(["A", "B", "C", "D"])
y = np.array([3, 8, 1, 10])

plt.bar(x,y)
plt.show()

Интересно, мои данные в неправильном формате? Какими будут мои оси x и y?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I wonder if my data is in the wrong format?

Не «неправильно» само по себе, но у него есть Мультииндекс, что немного неудобно и здесь не нужно. Я предлагаю избавиться от MultiIndex с помощью Series.droplevel перед построением графика с помощью pandas/matplotlib/seaborn.


Панда Бар сюжет

После удаления MultiIndex используйте Series.plot.bar, который отображает значения как у относительно индекса как Икс:

counts = table1.gt(0).astype(int).sum(axis=0).droplevel(0)
# year
# 2004    2
# 2005    1
# 2011    1
# 2016    1
# 2018    2
# dtype: int64

counts.plot.bar(ylabel='total')


столбчатый график matplotlib

Если вы действительно хотите использовать plt.bar, я предлагаю сбросить серию в DataFrame, а затем построить общий график с индексом диапазона:

counts = table1.gt(0).astype(int).sum(axis=0).droplevel(0).reset_index(name='total')
#    year  total
# 0  2004      2
# 1  2005      1
# 2  2011      1
# 3  2016      1
# 4  2018      2

plt.bar(counts.index, counts.total)
plt.xticks(ticks=counts.index, labels=counts.year)
plt.xlabel('year')
plt.ylabel('total')


участок с морским баром

В качестве альтернативы передайте DataFrame в sns.barplot:

import seaborn as sns
sns.barplot(data=counts, x='year', y='total')

Отлично, большое спасибо за подсказку! Работает идеально :)

ITN00bs 20.03.2022 08:43

Другие вопросы по теме