Сгруппировать по квартальному среднему и получить значения, которые использовались при вычислении среднего - pandas - PullRequest
1 голос
/ 08 мая 2020

У меня есть df вот так,

          time  value
0   2019-07-30  124.00
1   2019-07-19  123.00
2   2019-08-28  191.46
3   2019-10-25  181.13
4   2019-11-01  24.23
5   2019-11-13  340.00
6   2020-01-01  36.12
7   2020-01-25  56.12
8   2020-01-30  121.00
9   2020-02-04  115.62
10  2020-02-06  63.62

Я хочу сгруппировать по среднему кварталу и получить значения, которые использовались при вычислении среднего. Примерно так, как показано ниже.

Year  Quarter    Values                              Avg
2019  Q3         124, 123, 191                       146
2019  Q4         181.13, 24.23, 340                  181.78
2020  Q1         36.12, 26.12, 121, 115.62, 63.62    72.96

Как я могу достичь желаемого результата?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Создайте группу , groupby и измените индекс на год и квартал:

grouper = pd.Grouper(key='time',freq='Q')
res = (df
       .assign(temp = df.value.astype(str))
       .groupby(grouper)
       .agg(Values=('temp', ','.join),
            Avg = ('value',np.mean)
           )

      )

res.index = [res.index.year, 'Q' + res.index.quarter.astype(str)]
res.index = res.index.set_names(['Year','Quarter'])


                       Values                   Avg
Year    Quarter     
2019    Q3       123.0,124.0,191.46             146.153333
        Q4       181.13,24.23,340.0             181.786667
2020    Q1       36.12,56.12,121.0,115.62,63.62 78.496000
1 голос
/ 08 мая 2020

Используйте GroupBy.agg с квартальными периодами, созданными Series.dt.quarter, со значениями соединения, преобразованными в string s и mean в именованных агрегатах:

df['time'] = pd.to_datetime(df['time'])

df1 = (df.assign(Year = df['time'].dt.year,
                 Q = 'Q' + df['time'].dt.quarter.astype(str),
                 vals = df['value'].astype(str))
         .groupby(['Year','Q'])
         .agg(Values=('vals', ', '.join), Avg = ('value','mean'))
         .reset_index())
print (df1)

   Year   Q                              Values         Avg
0  2019  Q3                124.0, 123.0, 191.46  146.153333
1  2019  Q4                181.13, 24.23, 340.0  181.786667
2  2020  Q1  36.12, 56.12, 121.0, 115.62, 63.62   78.496000

РЕДАКТИРОВАТЬ:

df['time'] = pd.to_datetime(df['time'])

df1 = (df.groupby(df['time'].dt.to_period('Q').rename('YearQ'))['value']
         .agg([('Values', lambda x: ', '.join(x.astype(str))),('Avg','mean')])
         .reset_index()
         .assign(Year = lambda x: x['YearQ'].dt.year,
                 Q = lambda x: 'Q' + x['YearQ'].dt.quarter.astype(str))
         .reindex(['Year','Q','Values','Avg'], axis=1))
print (df1)
   Year   Q                              Values         Avg
0  2019  Q3                124.0, 123.0, 191.46  146.153333
1  2019  Q4                181.13, 24.23, 340.0  181.786667
2  2020  Q1  36.12, 56.12, 121.0, 115.62, 63.62   78.496000
...