Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Посчитать суммы значений по разным месяцам и развернуть строки в столбцы

#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

Комментариев нет:

Отправить комментарий