Работая с большими таблицами, зачастую сталкиваешься с задачей группировки записей по некоторым признакам с последующим подсчетом для каждого набора некоторых описательных статистик. Как делить данные я рассказывал ранее, поэтому остановлюсь на вычислении агрегированных показателей для групп.
В демонстрационных целях будем использовать набор объявлений о продажах квартир в Республике Северная Осетия-Алания, имеющий следующий вид:
Разобьем сведения об общей площади как рассказывалось в предыдущей статье на группы, различающихся в 5 кв.м., начиная от 10. А затем проиндексируем записи группой площади, к которой они относятся и временем публикации:
# устанавливаем date_time в качестве индекса
df = df.set_index(['date_time'])
# преобразуем в подневный период (отбрасываем время)
df = df.to_period('D')
# формируем список границ площадей и создаем столбец, задающий для каждой квартиры полуинтервал площадей, к которому она относится
sqs = np.hstack([np.arange(10,140,5),np.array([1000])])
df['sq_grs'] = pd.cut(df['total_square'],sqs)
sq_grps2int = {item:i for i, item in enumerate(df['sq_grs'].unique())}
# заменяем полуинтервалы целыми числами для простоты работы и адресации данных
df['sq_grs'] = df['sq_grs'].map(sq_grps2int)
df=df.reset_index()
# задаем индекс из двух столбцов для каждой записи
df = df.set_index(['date_time', 'sq_grs'])
В результате получаем таблицу следующего вида:
Значения столбца sq_grs соответствуют полуинтервалам диапазонов площадей:
Теперь можно выполнить операции группирования по индексу и вывести для каждого столбца, например, среднее арифметическое:
df_grs = df.groupby(level=[0,1]).mean()
В результате получим:
Здесь мы провели группирование по двум уровням индекса. Однако можно было бы это сделать и другим путем:
df_c = df_c.set_index(['date_time'])
df_c = df_c.to_period('D')
sqs = np.hstack([np.arange(10,140,5),np.array([1000])])
df_c['sq_grs'] = pd.cut(df_c['total_square'],sqs)
df_c= df_c.reset_index()
df_c = df_c.groupby(['date_time','sq_grs']).mean()
df_c = df_c[df_c['cost'].notnull()]
Отличием этого подхода является группировка не по индексу, а по значениям столбцов, после которой они заносятся в индекс.