groupby example column agg python pandas group-by time-series

column - python pandas dataframe groupby example



Pandas: volver a muestrear series de tiempo con groupby (3)

Pandas 0.21 respuesta: TimeGrouper está en desuso

Hay dos opciones para hacer esto. En realidad, pueden dar diferentes resultados en función de sus datos. La primera opción agrupa por ubicación y dentro de los grupos de ubicación por hora. La segunda opción agrupa por Ubicación y hora al mismo tiempo.

Opción 1 : usar groupby + resample

grouped = df.groupby(''Location'').resample(''H'')[''Event''].count()

Opción 2 : groupby(pd.Grouper) la ubicación y DatetimeIndex junto con groupby(pd.Grouper)

grouped = df.groupby([''Location'', pd.Grouper(freq=''H'')])[''Event''].count()

Ambos resultarán en lo siguiente:

Location HK 2014-08-25 21:00:00 1 LDN 2014-08-25 21:00:00 1 2014-08-25 22:00:00 2 Name: Event, dtype: int64

Y luego remodelar

grouped.unstack(''Location'', fill_value=0)

Saldrá

Location HK LDN 2014-08-25 21:00:00 1 1 2014-08-25 22:00:00 0 2

Dado el siguiente marco de datos de pandas:

In [115]: times = pd.to_datetime(pd.Series([''2014-08-25 21:00:00'',''2014-08-25 21:04:00'', ''2014-08-25 22:07:00'',''2014-08-25 22:09:00''])) locations = [''HK'', ''LDN'', ''LDN'', ''LDN''] event = [''foo'', ''bar'', ''baz'', ''qux''] df = pd.DataFrame({''Location'': locations, ''Event'': event}, index=times) df Out[115]: Event Location 2014-08-25 21:00:00 foo HK 2014-08-25 21:04:00 bar LDN 2014-08-25 22:07:00 baz LDN 2014-08-25 22:09:00 qux LDN

Me gustaría volver a muestrear los datos para agregarlos cada hora según el recuento, mientras que la agrupación por ubicación produce un marco de datos que se parece a esto:

Out[115]: HK LDN 2014-08-25 21:00:00 1 1 2014-08-25 22:00:00 0 2

He intentado varias combinaciones de resample () y groupby () pero sin suerte. ¿Cómo voy a hacer esto?


En mi publicación original, sugerí usar pd.TimeGrouper . Hoy en día, use pd.Grouper lugar de pd.TimeGrouper . La sintaxis es en gran parte la misma, pero TimeGrouper ahora está en desuso a favor de pd.Grouper .

Además, mientras que pd.TimeGrouper solo podía agruparse por DatetimeIndex, pd.Grouper puede agrupar por columnas de fecha y hora que puede especificar a través del parámetro key .

Podría usar un pd.Grouper para agrupar el marco de datos de DatetimeIndex por hora:

grouper = df.groupby([pd.Grouper(''1H''), ''Location''])

usa count para contar el número de eventos en cada grupo:

grouper[''Event''].count() # Location # 2014-08-25 21:00:00 HK 1 # LDN 1 # 2014-08-25 22:00:00 LDN 2 # Name: Event, dtype: int64

use unstack para mover el nivel del índice de Location a un nivel de columna:

grouper[''Event''].count().unstack() # Out[49]: # Location HK LDN # 2014-08-25 21:00:00 1 1 # 2014-08-25 22:00:00 NaN 2

y luego use fillna para cambiar los NaN a ceros.

Poniendolo todo junto,

grouper = df.groupby([pd.Grouper(''1H''), ''Location'']) result = grouper[''Event''].count().unstack(''Location'').fillna(0)

rendimientos

Location HK LDN 2014-08-25 21:00:00 1 1 2014-08-25 22:00:00 0 2


Grupo de columnas múltiples por

untubu es acertado con su respuesta, pero quería agregar lo que podría hacer si tuviera una tercera columna, diga Cost y quisiera agregarla como arriba. Fue a través de la combinación de la respuesta de unutbu y esta, que descubrí cómo hacerlo y pensé que compartiría para futuros usuarios.

Crear DataFrame con Cost colunm.

In[1]: import pandas as pd times = pd.to_datetime(pd.Series([''2014-08-25 21:00:00'', ''2014-08-25 21:04:00'',''2014-08-25 22:07:00'',''2014-08-25 22:09:00''])) locations = [''HK'', ''LDN'', ''LDN'', ''LDN''] event = [''foo'', ''bar'', ''baz'', ''qux''] cost = [20, 24, 34, 52] # add in cost colunm df = pd.DataFrame({''Location'': locations, ''Event'': event, ''Cost'': cost}, index=times) df Out[1]: Event Location Cost 2014-08-25 21:00:00 foo HK 20 2014-08-25 21:04:00 bar LDN 24 2014-08-25 22:07:00 baz LDN 34 2014-08-25 22:09:00 qux LDN 52

Ahora agg utilizando la función agg para especificar cada método de agregación de columnas, es decir, conteo, media, suma, etc.

In[2]: df = df.groupby([pd.TimeGrouper(''1H''), ''Location'']).agg({''Event'': np.sum, ''Cost'': np.mean}) Out[2]: Location Event Cost 2014-08-25 21:00:00 HK 1 20 LDN 1 24 2014-08-25 22:00:00 LDN 2 43

Luego, el final del unstack rellena con NaN con ceros y se muestra como int porque es bueno.

In[3]: df.df.unstack().fillna(0).astype(int) Out[3]: Cost Event Location HK LDN HK LDN 2014-08-25 21:00:00 20 24 1 1 2014-08-25 22:00:00 0 43 0 2