pandas в группе по индивидуальному году, например, учебный год - PullRequest
0 голосов
/ 05 марта 2020

В фрейме данных pandas я хотел бы найти средние значения столбца, сгруппированного по «настроенному» году.

Примером может служить вычисление средних значений школьных оценок за учебный год (например, сентябрь / гггг - август / гггг + 1). Документы pandas дают некоторую информацию о смещениях и финансовом году и т. Д. c., Но я не могу из этого ничего понять, чтобы получить рабочий пример.

Вот минимальный пример, где среднее значение значения школьных оценок рассчитываются за год (январь-декабрь c), чего я не хочу .

import pandas as pd
import numpy as np


df = pd.DataFrame(data=np.random.randint(low=1, high=5, size=36),
            index=pd.date_range('2001-09-01', freq='M', periods=36),
            columns=['marks'])

df_yearly = df.groupby(pd.Grouper(freq="A")).mean()

Это может привести к примеру:

print(df):
            marks
2001-09-30      1
2001-10-31      4
2001-11-30      2
2001-12-31      1
2002-01-31      4
2002-02-28      1
2002-03-31      2
2002-04-30      1
2002-05-31      3
2002-06-30      3
2002-07-31      3
2002-08-31      3
2002-09-30      4
2002-10-31      1
...
2003-11-30      4
2003-12-31      2
2004-01-31      1
2004-02-29      2
2004-03-31      1
2004-04-30      3
2004-05-31      4
2004-06-30      2
2004-07-31      2
2004-08-31      4

print(df_yearly):

          marks
2001-12-31  2.000000
2002-12-31  2.583333
2003-12-31  2.666667
2004-12-31  2.375000

Мой желаемый результат будет соответствовать чему-то вроде:

2001-09/2002-08 mean_value
2002-09/2003-08 mean_value
2003-09/2004-08 mean_value

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Еще один подход

a = (df.index.month == 9).cumsum()
val = df.groupby(a, sort=False)['marks'].mean().reset_index()
dates = df.index.to_series().groupby(a, sort=False).agg(['first', 'last']).reset_index()
dates.merge(val, on='index')

Вывод

  index     first         last  marks
0   1   2001-09-30  2002-08-31  2.750000
1   2   2002-09-30  2003-08-31  2.333333
2   3   2003-09-30  2004-08-31  2.083333
1 голос
/ 05 марта 2020

Мы можем вручную вычислить школьные годы:

# if month>=9 we move it to the next year
school_years = df.index.year + (df.index.month>8).astype(int)

Другой вариант - использовать финансовый год, начинающийся с сентября:

school_years = df.index.to_period('Q-AUG').qyear

И мы можем сгруппировать:

df.groupby(school_years).mean()

Вывод:

         marks
2002  2.333333
2003  2.500000
2004  2.500000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...