Построить линейную диаграмму, сгруппировав столбцы в кадре данных

У меня есть CSV-файл с данными, которые я сгруппировал информацию по месяцам, а затем использовал cumsum для вычисления промежуточного итога за месяц в кадре данных.

Используя этот код:

df = df.sort_index(sort_remaining=True).sort_values('months')
df['value'] = df.groupby('months')['value'].cumsum()

Пример OUTPUT в EXCEL, но мой DF будет выглядеть так же с тысячами строк:

пример вывода

Теперь я хотел бы построить график, который группирует месяц и отображает каждое значение, так что в основном у меня будет 12 построенных линий, показывающих, как значение перемещалось с течением времени либо выше, либо ниже.

Выходной график будет выглядеть как следующий график, показывающий сумму каждого месяца: Диаграмма, показывающая сумму каждого месяца

#

Благодаря @jezrael это теперь работает. Ниже сюжет Рабочий выход

1 ответ

Решение

Я считаю нужным pivot с rename для названий месяцев вместо числовых и для новых значений индекса используйте cumcount:

d = {1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May',
     6 : 'Jun',7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'}

g = df.groupby('months').cumcount()
pd.pivot(index=g, columns=df['months'], values=df['value']).rename(columns=d).plot()

Деталь:

print(pd.pivot(index=g, columns=df['months'], values=df['value']).rename(columns=d))
months    Jan   Feb   Mar   Apr
0        50.0   2.0  10.0   5.0
1        80.0   3.0  16.0  20.0
2       120.0   8.0  31.0  40.0
3       140.0  11.0  34.0  50.0
4         NaN  15.0  43.0  75.0

РЕДАКТИРОВАТЬ:

Для определения только несколько месяцев для использования участка subset:

months = ['Mar','Apr']
g = df.groupby('months').cumcount()
pd.pivot(index=g, columns=df['months'], values=df['value']).rename(columns=d)[months].plot()

Или фильтруйте месяцы на входе DataFrame от boolean indexing а также isin:

df = df[df['months'].isin([3,4])]
g = df.groupby('months').cumcount()
pd.pivot(index=g, columns=df['months'], values=df['value']).rename(columns=d)[months].plot()
Другие вопросы по тегам