Построение графиков по уникальным значениям DataFrame
Имею DataFrame ds_pivot. Для каждого уникального course_title нужно построить линейный график, который будет отображать ежемесячный прирост студентов .cumsum.
Не могу придумать, как не выводить руками отдельный DataFrame для каждого курса, а сделать это программно.
Что есть сейчас:
test = copy.deepcopy(ds_pivot[ds_pivot.course_title == 'Excel Базовый'])
test['cumsum'] = ds_pivot['uniq_st_id'].cumsum()
fig, subplot = plt.subplots()
subplot.plot(test['month_start'], test['cumsum'])
plt.show()
Но как рассчитать нарастающий итог внутри всего ds_pivot для каждого отдельного курса, а потом построить отдельный .plot для каждого курса, не разбивая это всё на куски?
Пробовал через цикл хотя бы вывести данные по количеству студентов в каждый месяц, но и тут не взлетело. А ещё читал, что циклы в .pandas - не самое рациональное решение.
n = 1
for index, row in ds_pivot.iterrows():
while n <= 16:
plt.subplot(4, 4, n)
subplot.plot(ds_pivot['month_start'], ds_pivot['uniq_st_id'])
n += 1
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
df = pd.read_csv(r"D:\download\ds_pivot.csv", index_col=0)
df["month"] = pd.to_datetime(df["month_start"].astype(str) + "01").dt.to_period("M")
df = df.sort_values(["course_title", "month"])
df["students"] = df.groupby("course_title")["uniq_st_id"].cumsum()
piv = df.pivot_table(index="month", columns="course_title",
values="students", aggfunc="sum")
piv.loc["2018-01":].plot(figsize=(14, 6), grid=True)

