Как посчитать среднее значение по каждому интервалу и вывести в отдельный DataFrame?

Нужно посчитать среднее значение по каждому интервалу и вывести в отдельный DataFrame.

Имеем:

                              Groups  pairs
Interval                                   
A1        A1-A2; A1-A1; A1-A3; A1-A1      4
A2        A2-A3; A2-A2; A2-A1; A2-A2      4
A3        A3-A2; A3-A2; A3-A1; A3-A3      4
A4                      A4-A3; A4-A4      2
A6                             A6-A4      1
A7                             A7-A8      1
A8               A8-A6; A8-A9; A8-A8      3
A9                      A9-A8; A9-A7      2

Хотим получить:

                              Groups  pairs sred
Interval                                   
A1        A1-A2; A1-A1; A1-A3; A1-A1      4  2951,2
A2        A2-A3; A2-A2; A2-A1; A2-A2      4  3347.65
A3        A3-A2; A3-A2; A3-A1; A3-A3      4  3744.1
A4                      A4-A3; A4-A4      2  4140.55
A6                             A6-A4      1  4933.45
A7                             A7-A8      1  5329.9
A8               A8-A6; A8-A9; A8-A8      3  5726.35
A9                      A9-A8; A9-A7      2  6122.8

Мой код реализации:

import pandas as pd

# Импортирую

excel_file = pd.ExcelFile('example.xlsx')
require_cols = [1]
df = pd.read_excel('example.xlsx', usecols=require_cols)
df_min_max = df.aggregate(['min', 'max'])
my_list = df["Data"].tolist()

# Меняем кол-во интервалов
bins = 9

# Сопоставляем данные с интервалами
df["Interval"] = pd.cut(df["Data"], bins,
                        labels=["A" + str(x) for x in range(1, bins + 1)])
# Разбиваем на группы

df["Interval"] = df["Interval"].astype(str)
df.loc[1:, "Groups"] = df.loc[1:, "Interval"] + "-" + df["Interval"].shift().loc[1:]

res = (df
       .dropna(subset=["Groups"])
       .groupby("Interval")
       ["Groups"]
       .apply(lambda x: x.str.cat(sep="; "))).to_frame()

res["pairs"] = res["Groups"].str.split(";").apply(lambda x: len(x))

# Выводим результаты

print(my_list)
print(df_min_max)
print(res)

Ответы (2 шт):

Автор решения: strawdog

На основании ваших предыдущих данных:

res["sred"] = df.groupby("Interval")["Data"].mean()

тогда res будет:

                              Groups  pairs     sred
Interval                                            
A1        A1-A2; A1-A1; A1-A3; A1-A1      4  2898.25
A2        A2-A3; A2-A2; A2-A1; A2-A2      4  3376.20
A3        A3-A2; A3-A2; A3-A1; A3-A3      4  3602.75
A4                      A4-A3; A4-A4      2  4026.00
A6                             A6-A4      1  4870.00
A7                             A7-A8      1  5521.00
A8               A8-A6; A8-A9; A8-A8      3  5827.00
A9                      A9-A8; A9-A7      2  6158.00
→ Ссылка
Автор решения: MaxU

Столбцы pairs, Group и sred можно получить одной командой:

res = (df
       .dropna(subset=["Groups"])
       .groupby("Interval")
       .agg(pairs=("Data", "count"), 
            Groups=("Groups", lambda x: x.str.cat(sep="; ")), 
            sred=("Data", "mean")))

результат:

In [18]: res
Out[18]: 
          pairs                      Groups     sred
Interval                                            
A1            4  A1-A2; A1-A1; A1-A3; A1-A1  2898.25
A2            4  A2-A3; A2-A2; A2-A1; A2-A2  3366.75
A3            4  A3-A2; A3-A2; A3-A1; A3-A3  3602.75
A4            2                A4-A3; A4-A4  4026.00
A6            1                       A6-A4  4870.00
A7            1                       A7-A8  5521.00
A8            3         A8-A6; A8-A9; A8-A8  5827.00
A9            2                A9-A8; A9-A7  6158.00
→ Ссылка