функции min() max() и sum(), работающие с группировкой pandas по объекту, но не mean()

#python #pandas #dataframe #pandas-groupby #mean

#python #pandas #фрейм данных #pandas-groupby #среднее

Вопрос:

Итак, по сути, я сгруппировал столбцы месяца в кварталы, такие как столбцы 2000-01, 2000-02, 2000-03, в одну группу 2000q1, где q1 означает квартал 1 и так далее. Я сделал это за 16 x 12 месяцев и сформировал 48 кварталов.

Теперь я хочу получить среднее значение каждой строки в группе. Когда я это делаю grouped.max() grouped.min() , и grouped.sum() я получаю min, max и sum каждой строки в каждой группе.(Индексы строк одинаковы для каждой группы)

Но когда я пытаюсь grouped.mean() , я получаю сообщение об ошибке:

Нет числовых типов для агрегирования.

Вот код, который я написал:

 def quarter(val):
    month=val[5:]
    if month == "01" or month == "02"or month == "03":
        return val[:4] "q1"
    elif month == "04"or month == "05"or month == "06":
        return val[:4] "q2"  
    elif month == "07" or month == "08" or month == "09":
        return val[:4] "q3"    
    elif month == "10"or month == "11"or month == "12":
        return val[:4] "q4"  
city.fillna(0,inplace=True)


g=city.groupby(quarter, axis= 1 ).mean() 
  

Вот как выглядят мои сгруппированные данные

[(‘2000q1’, 2000-01 2000-02 2000-03

0 0.0 0.0 0.0
1 204400.0 207000.0 209800.0
2 136800.0 138300.0 140100.0
3 52700.0 53100.0 53200.0
4 111000.0 111700.0 112800.0
5 131700.0 132600.0 133500.0

(‘2000q2’, 2000-04 2000-05 2000-06
0 0.0 0.0 0.0
1 212300.0 214500.0 216600.0
2 141900.0 143700.0 145300.0
3 53400.0 53700.0 53800.0
4 113700.0 114300.0 115100.0
5 134100.0 134400.0 134600.0

(‘2002q2’, 2002-04 2002-05 2002-06
0 0.0 0.0 0.0
1 268600.0 272600.0 276900.0
2 177800.0 177600.0 177300.0
3 60300.0 60700.0 61200.0
4 127900.0 128400.0 128800.0
5 150400.0 151000.0 151400.0

Вот как выглядит городвведите описание изображения здесь, это часть вывода, который я получаю, когда я выполняю grouped.max()

Комментарии:

1. Не могли бы вы добавить некоторые данные в текстовую форму?

2. @Grayrigel Могу ли я вместо этого поместить его изображение?

3. было бы проще, если бы вы превратили свою текстовую дату в фактическую дату-время — и ваши условия можно было бы перефразировать как if month in "01 02 03": или if month in ("01","02","03"): (использовать ( или [..] или {..}

4. @meerakapoor Мы не можем скопировать / вставить и воспроизвести ошибку с картинки. Вам не нужно добавлять полные данные. Просто добавьте несколько примеров данных.

5. @PatrickArtner отредактировал мой вопрос, чтобы указать, как выглядят сгруппированные данные, пожалуйста, проверьте

Ответ №1:

Проще группировать столбцы со значениями и выполнять операции.

 df = pd.DataFrame({'Region':[1,2,3],'City':['a','b','c'],'Country':['A','B','C']})

df = pd.concat([df,pd.DataFrame(np.random.uniform(0,1,(3,12)),
columns=['2000-01','2000-02','2000-03','2000-04','2000-05','2000-06','2001-01','2001-02','2001-03','2001-04','2001-05','2001-06'])],axis=1)
  

Вы можете использовать функцию даты и времени для создания кварталов:

 def quarter(val):
    return pd.to_datetime(val).to_period("Q")

quarter(df.columns[3:])
 
PeriodIndex(['2000Q1', '2000Q1', '2000Q1', '2000Q2', '2000Q2', '2000Q2',
             '2001Q1', '2001Q1', '2001Q1', '2001Q2', '2001Q2', '2001Q2'],
            dtype='period[Q-DEC]', freq='Q-DEC')
  

Затем мы берем столбцы с числовыми значениями:

 df.iloc[:,3:].groupby(quarter,axis=1).mean()
 
     2000Q1    2000Q2    2001Q1    2001Q2
0  0.506088  0.438958  0.132090  0.360160
1  0.635036  0.496895  0.673494  0.437333
2  0.560944  0.640423  0.603011  0.482962
  

Вы всегда можете объединить первые три столбца:

 pd.concat([df.iloc[:,:3],df.iloc[:,3:].groupby(quarter,axis=1).mean()],axis=1)