Объедините массивы в единую таблицу с помощью панд

#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. Подобное объединение в цикле является анти-шаблоном