#python #pandas #dataframe #pivot
Итак, есть исходный DF: YEAR Sec X1 31.01.2000 A 5 31.01.2000 A 6 31.01.2000 B 7 31.01.2000 B 8 31.01.2000 C 9 31.03.2000 C 8 31.12.2000 A 5 31.12.2000 A 6 31.12.2000 B 8 31.12.2000 B 7 31.01.2001 A 5 31.01.2001 B 6 31.12.2001 A 6 31.12.2001 B 4 Необходимо сделать следующий манипуляции: для каждого из годов взять первый и последний месяца и посчитать в них сумму X1 для каждого значения из Sec, а потом вывести их отношение То есть на выходе нужно получить: YEAR Sec Jan Dec Otn 2000 A 11 11 1 2000 B 15 15 1 2000 C 9 NaN NaN 2001 A 5 6 1,2 2001 B 6 4 0,666666667
Ответы
Ответ 1
Попробуйте так: mask = df['YEAR'].dt.month.isin([1, 12]) d = df[mask] res = (d.assign(Year=d['YEAR'].dt.year, m=d['YEAR'].dt.strftime('%b')) .pivot_table(index=['Year','Sec'], columns='m', values='X1', aggfunc='sum') .reset_index() .eval("Otn = Dec / Jan")) Результат: In [17]: res Out[17]: m Year Sec Dec Jan Otn 0 2000 A 11.0 11.0 1.000000 1 2000 B 15.0 15.0 1.000000 2 2000 C NaN 9.0 NaN 3 2001 A 6.0 5.0 1.200000 4 2001 B 4.0 6.0 0.666667 Для того чтобы понять как это работает проще всего выполнять команды пошагово: In [18]: d.assign(Year=d['YEAR'].dt.year, m=d['YEAR'].dt.strftime('%b')) Out[18]: YEAR Sec X1 Year m 0 2000-01-31 A 5 2000 Jan 1 2000-01-31 A 6 2000 Jan 2 2000-01-31 B 7 2000 Jan 3 2000-01-31 B 8 2000 Jan 4 2000-01-31 C 9 2000 Jan 6 2000-12-31 A 5 2000 Dec 7 2000-12-31 A 6 2000 Dec 8 2000-12-31 B 8 2000 Dec 9 2000-12-31 B 7 2000 Dec 10 2001-01-31 A 5 2001 Jan 11 2001-01-31 B 6 2001 Jan 12 2001-12-31 A 6 2001 Dec 13 2001-12-31 B 4 2001 Dec In [19]: (d.assign(Year=d['YEAR'].dt.year, m=d['YEAR'].dt.strftime('%b')) ...: .pivot_table(index=['Year','Sec'], columns='m', ...: values='X1', aggfunc='sum')) Out[19]: m Dec Jan Year Sec 2000 A 11.0 11.0 B 15.0 15.0 C NaN 9.0 2001 A 6.0 5.0 B 4.0 6.0 и т.д.Ответ 2
Получилось добиться похожего результата так: (df.query('YEAR.dt.month in [1, 12]') .assign(YEAR=df.YEAR.dt.year, Month=df.YEAR.dt.month_name()) .groupby(['YEAR','Month', 'Sec'])['X1'] .sum() .unstack('Month') .reset_index() .assign(Otn=lambda x: x.December/x.January) .rename(columns={'December': 'Dec', 'January': 'Jan'}) .reindex(columns=['YEAR', 'Sec', 'Jan', 'Dec', 'Otn'])) Month YEAR Sec Jan Dec Otn 0 2000 A 11.0 11.0 1.000000 1 2000 B 15.0 15.0 1.000000 2 2000 C 9.0 NaN NaN 3 2001 A 5.0 6.0 1.200000 4 2001 B 6.0 4.0 0.666667
Комментариев нет:
Отправить комментарий