#python #python-3.x #pandas #dataframe
Вопрос:
У меня есть файл .csv, из этого файла я группирую его по годам, чтобы в результате он давал мне максимальные, минимальные и средние значения
import pandas as pd
DF = pd.read_csv("PJME_hourly.csv")
for i in range(2002,2019):
neblina = DF[DF.Datetime.str.contains(str(i))]
dateframe = neblina.agg({"PJME_MW" : ['max','min','mean']})
print(i , pd.concat([dateframe],axis=0,sort= False))
Его результат выглядит следующим образом:
2002 PJME_MW
max 55934.000000
min 19247.000000
mean 31565.617106
2003 PJME_MW
max 53737.000000
min 19414.000000
mean 31698.758621
2004 PJME_MW
max 51962.000000
min 19543.000000
mean 32270.434867
Я хотел бы знать, как я могу объединить все это в один столбец (PJME_MW), но чтобы каждая группа операций (максимальная, минимальная, средняя) определялась по году, который ей соответствует.
Комментарии:
1. тебе действительно не следует так поступать. Почти наверняка, вы хотите использовать
DF.groupby
2. Как я могу сделать так, чтобы максимальные, минимальные и средние значения одного и того же вычислялись в группе за каждый год, и все отображалось в одной таблице, так как способ, которым я это сделал, дает мне желаемый результат, но он генерирует другую таблицу для каждого года.
Ответ №1:
Если вы преобразуете даты to_datetime()
, вы можете сгруппировать их с помощью средства dt.year
доступа:
df = pd.read_csv('PJME_hourly.csv')
df.Datetime = pd.to_datetime(df.Datetime)
df.groupby(df.Datetime.dt.year).agg(['min', 'max', 'mean'])
Игрушечный пример:
df = pd.DataFrame({'Datetime': ['2019-01-01','2019-02-01','2020-01-01','2020-02-01','2021-01-01'], 'PJME_MV': [3,5,30,50,100]})
# Datetime PJME_MV
# 0 2019-01-01 3
# 1 2019-02-01 5
# 2 2020-01-01 30
# 3 2020-02-01 50
# 4 2021-01-01 100
df.Datetime = pd.to_datetime(df.Datetime)
df.groupby(df.Datetime.dt.year).agg(['min', 'max', 'mean'])
# PJME_MV
# min max mean
# Datetime
# 2019 3 5 4
# 2020 30 50 40
# 2021 100 100 100
Ответ №2:
Код можно было бы оптимизировать, но как это работает сейчас, измените эту часть кода:
for i in range(2002,2019):
neblina = DF[DF.Datetime.str.contains(str(i))]
dateframe = neblina.agg({"PJME_MW" : ['max','min','mean']})
print(i , pd.concat([dateframe],axis=0,sort= False))
Используйте это вместо
aggs = ['max','min','mean']
df_group = df.groupby('Datetime')['PJME_MW'].agg(aggs).reset_index()
out_columns = ['agg_year', 'PJME_MW']
out = []
aux = pd.DataFrame(columns=out_columns)
for agg in aggs:
aux['agg_year'] = agg '_' df_group['Datetime']
aux['PJME_MW'] = df_group[agg]
out.append(aux)
df_out = pd.concat(out)
Изменить: Форма объединения была изменена
Последнее редактирование: Извините, я не понял всей проблемы. Вам не нужен код после groupby
функции
Комментарии:
1. Подобное объединение в цикле является анти-шаблоном