python - tablas - Trazar histogramas de datos agrupados en un marco de datos de pandas
recorrer data frame pandas (3)
Estoy en una lista, solo encontré una forma aún más simple de hacerlo usando la palabra clave por en el método hist:
df[''N''].hist(by=df[''Letter''])
¡Es un pequeño atajo muy útil para escanear rápidamente tus datos agrupados!
Para los visitantes futuros, el producto de esta llamada es la siguiente tabla:
Necesito una guía para calcular cómo trazar un bloque de histogramas a partir de datos agrupados en un marco de datos de pandas. Aquí hay un ejemplo para ilustrar mi pregunta:
from pandas import DataFrame
import numpy as np
x = [''A'']*300 + [''B'']*400 + [''C'']*300
y = np.random.randn(1000)
df = DataFrame({''Letter'':x, ''N'':y})
grouped = df.groupby(''Letter'')
En mi ignorancia probé este comando de código:
df.groupby(''Letter'').hist()
que falló con el mensaje de error "TypeError: no se puede concatenar ''str'' y ''flotar'' objetos"
Cualquier ayuda más apreciada.
Su función está fallando porque el groupby dataframe con el que termina tiene un índice jerárquico y dos columnas (Letter y N) así que cuando lo haga .hist()
está tratando de hacer un histograma de ambas columnas, por lo tanto, el error str.
Este es el comportamiento predeterminado de las funciones de trazado de pandas (un trazado por columna) por lo que si modifica su marco de datos para que cada letra sea una columna obtendrá exactamente lo que desea.
df.reset_index().pivot(''index'',''Letter'',''N'').hist()
El reset_index()
es solo para empujar el índice actual en una columna llamada index
. Luego, el pivot
tomará su marco de datos, recogerá todos los valores N
para cada Letter
y los convertirá en una columna. El marco de datos resultante como 400 filas (rellena los valores faltantes con NaN
) y tres columnas ( A, B, C
). hist()
producirá un histograma por columna y obtendrá el formato de las gráficas según sea necesario.
Una solución es usar el histograma matplotlib directamente en cada marco de datos agrupado. Puede recorrer los grupos obtenidos en un bucle. Cada grupo es un marco de datos. Y puedes crear un histograma para cada uno.
from pandas import DataFrame
import numpy as np
x = [''A'']*300 + [''B'']*400 + [''C'']*300
y = np.random.randn(1000)
df = DataFrame({''Letter'':x, ''N'':y})
grouped = df.groupby(''Letter'')
for group in grouped:
figure()
matplotlib.pyplot.hist(group[1].N)
show()