Генерация нескольких графиков категориальных данных для отображения тенденции за несколько лет данных - PullRequest
0 голосов
/ 04 марта 2020

У меня есть датафрейм, ~ 14000 строк и ~ 100 столбцов. Я хочу представить, как со временем менялись частоты одного столбца категориальных данных (второй столбец - ГГГГ). Вот упрощенный фрейм данных:

import pandas as pd
df = pd.DataFrame({
'Year': ('1999','1999','1999','2000','2000','2001','2001','2002','2003'),
'Cat': ('A','A','C','B','B','B','C','D','D')
})

Используя Pandas groupby и reset_index, я остался с интересующими данными в хорошей таблице.

df = df.groupby(['Year', 'Cat'])['Cat'].size()
df = df.reset_index(name='count')

Для каждого года я хотел бы график, показывающий частоту (количество) каждой кошки (даже если 0). Поскольку набор данных охватывает 16 лет, я бы хотел, чтобы он был представлен в виде матрицы столбчатых диаграмм 4x4 (приведенный выше тестовый набор данных ограничивался бы 2x2). , но мой python опыт ограничен, и я пока не могу его взломать.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Вы можете использовать reindex, чтобы получить нулевые значения, а затем построить график с помощью seaborn FacetGrid. Я использовал value_counts, чтобы сначала получить фрейм данных, но вы могли бы использовать set_index с фреймом данных, который у вас есть, затем использовать reset_index.

df2 = df.groupby('Year')['Cat'].value_counts()
df2.name = 'count'
ix = pd.MultiIndex.from_product([df2.index.levels[0], list('ABCD')], names=['Year', 'Cat'])
df2 = df2.reindex(ix, fill_value=0).reset_index()

g = sns.FacetGrid(df2, col='Year', col_wrap=2)
g.map(plt.bar, 'Cat', 'count')

enter image description here

0 голосов
/ 04 марта 2020

Я не совсем уверен, что вы хотите сделать, но я надеюсь, что это поможет вам.

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Year': ('1999','1999','1999','2000','2000','2001','2001','2002','2003'),
'Cat': ('A','A','C','B','B','B','C','D','D')
})

labels = df.Year
Cat = df.Cat


x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, Cat, width, label='Cat')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scoring or I dunno')
ax.set_title('Some Letters')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()


def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')


autolabel(rects1)

fig.tight_layout()

plt.show()

Результат

https://matplotlib.org/gallery/lines_bars_and_markers/barchart.html#sphx -glr-галерея-линия-баре-и-маркеры-шкальный-р

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...