Построить линейную диаграмму, сгруппировав столбцы в кадре данных
У меня есть CSV-файл с данными, которые я сгруппировал информацию по месяцам, а затем использовал cumsum для вычисления промежуточного итога за месяц в кадре данных.
Используя этот код:
df = df.sort_index(sort_remaining=True).sort_values('months')
df['value'] = df.groupby('months')['value'].cumsum()
Пример OUTPUT в EXCEL, но мой DF будет выглядеть так же с тысячами строк:
Теперь я хотел бы построить график, который группирует месяц и отображает каждое значение, так что в основном у меня будет 12 построенных линий, показывающих, как значение перемещалось с течением времени либо выше, либо ниже.
Выходной график будет выглядеть как следующий график, показывающий сумму каждого месяца:
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()