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