Как посчитать среднее значение по каждому интервалу и вывести в отдельный 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