- Aprender
- Informática
- Ciencia de datos e IA
- Análisis de datos con Python
- Agrupación y agregación con pandas
Agrupación y agregación con pandas
IntermedioUnidad 5 de 8 del curso Curso de Análisis de datos con Python
Lo que aprenderás
- Explica el patrón de dividir, aplicar y combinar, crea objetos GroupBy a partir de distintos tipos de claves y controla las etiquetas, el orden y las combinaciones incluidas en el resultado agrupado.
- Explica el patrón de dividir, aplicar y combinar y el objeto GroupByDescribe qué sucede cuando pandas agrupa un DataFrame, inspecciona los grupos que forma y selecciona las columnas que se van a resumir.
- Agrupa por columnas, arreglos, correspondencias, funciones y niveles del índiceElige y combina claves de agrupación, desde una o varias columnas hasta claves derivadas, correspondencias, funciones y niveles del índice.
- Controla las claves de grupo, el orden y las claves faltantes en los resultadosConfigura los resultados agrupados para seguir trabajando: claves como índice o columnas, salida ordenada, claves faltantes y categorías no utilizadas, y nombres claros.
- Explica el patrón de dividir, aplicar y combinar y el objeto GroupBy
- Reduce cada grupo a valores de resumen mediante agregaciones incorporadas, varias agregaciones en una sola llamada y funciones personalizadas, e interpreta correctamente los resultados.
- Utiliza correctamente los métodos de agregación incorporadosCalcula recuentos, totales, medias, medidas de dispersión y otros resúmenes por grupo, y conoce cómo tratan los valores faltantes y las columnas de texto.
- Aplica varias agregaciones a la vez con aggUtiliza agg con listas, diccionarios y agregación con nombres de salida para crear tablas de resumen con nombres de columna claros.
- Escribe funciones de agregación personalizadasEscribe tus propias funciones que reducen un grupo a un valor, asigna nombres a sus resultados y reconoce cuándo es mejor una función incorporada o un cociente de sumas.
- Utiliza correctamente los métodos de agregación incorporados
- Añade resultados de grupo a cada fila, calcula valores acumulados y relativos dentro de los grupos, conserva grupos y filas o selecciona muestras, y utiliza apply para operaciones que los demás métodos no pueden expresar.
- Añade estadísticos del grupo a cada fila con transformUtiliza transform para difundir los resultados de grupo a las filas originales y calcular proporciones, desviaciones y valores estandarizados, y rellenar datos faltantes según el grupo.
- Calcula sumas acumuladas, rangos y variaciones dentro de los gruposUtiliza métodos acumulativos, de asignación de rangos y de desplazamiento que se reinician en cada grupo, y conserva las filas en el orden deseado.
- Conserva, elimina o selecciona muestras de filas grupo a grupoFiltra grupos completos según una condición, toma las primeras, últimas o mejores filas de cada grupo y obtén muestras aleatorias dentro de los grupos.
- Ejecuta operaciones generales por grupos con applyUtiliza apply para operaciones por grupos que necesitan varias columnas o devuelven tablas, predice la forma de su resultado y prefiere métodos más rápidos cuando sean adecuados.
- Añade estadísticos del grupo a cada fila con transform
- Convierte valores numéricos en categorías de intervalos con cut y qcut, calcula cuantiles y utiliza los intervalos como claves de agrupación para el análisis por intervalos y cuantiles.
- Agrupa valores en intervalos con cutUtiliza cut con límites explícitos o un número de intervalos de igual amplitud, interpreta la notación de intervalos y controla los límites, las etiquetas y los valores fuera de los intervalos.
- Crea intervalos con igual número de observaciones mediante cuantiles y qcutCalcula cuantiles, crea intervalos basados en cuantiles con qcut, compáralos con intervalos de igual amplitud y trata los empates.
- Compara grupos definidos por intervalos y cuantilesUtiliza el resultado de cut y qcut como claves de agrupación para el análisis por intervalos y cuantiles, conserva los intervalos vacíos cuando sea necesario e interpreta los resultados con cuidado.
- Agrupa valores en intervalos con cut
- Crea tablas de resumen de doble entrada con pivot_table y crosstab, añade totales, convierte recuentos en proporciones y elige la tabla que responda a la pregunta.
- Crea tablas dinámicas con pivot_tableResume valores por claves de fila y columna con pivot_table, elige la función de agregación y añade valores de relleno y totales.
- Cuenta y compara categorías con crosstabCrea tablas de frecuencias de dos variables categóricas con crosstab, añade totales, convierte recuentos en proporciones por fila, columna o respecto al total general y elige la proporción que responda a la pregunta.
- Crea tablas dinámicas con pivot_table
Guía de estudio de Agrupación y agregación con pandas
1Divide los datos en grupos con groupby
El análisis agrupado comienza con una pregunta como «¿Cuántas unidades vendió cada región?». Eliges las claves que definen un grupo, seleccionas los valores que vas a analizar y decides qué forma debe tener la respuesta. Las mismas filas pueden servir para calcular totales regionales, comparar productos o combinar ambos enfoques. Comprender las claves, los índices y las categorías faltantes facilita la inspección de esos resultados y su uso en un informe.
1.1 Explica el patrón de dividir, aplicar y combinar y el objeto GroupBy
Un grupo contiene filas con el mismo valor de clave. Si la clave es region, todos los pedidos de North pertenecen a un grupo, aunque estén dispersos por la tabla. Dividir, aplicar y combinar significa identificar estos grupos, realizar la misma operación dentro de cada uno y reunir los resultados.
Comienza con los datos de pedidos
Los ejemplos utilizan pandas 3 con import pandas as pd y NumPy como np. Crea la tabla de pedidos de bebidas:
sales = pd.DataFrame({
"region": ["North", "South", "North", "East", "South", "East", "North", "South"],
"product": ["tea", "tea", "coffee", "coffee", "coffee", "tea", "tea", "coffee"],
"units": [10, 4, 7, 5, 9, 3, 6, 8],
"revenue": [30, 12, 28, 20, 36, 9, 18, 32]
})
Aquí los ingresos no tienen unidad monetaria. El té genera ingresos de 3 por unidad y el café de 4 por unidad. Las etiquetas de fila predeterminadas van de 0 a 7.
De un objeto GroupBy a una respuesta
sales.groupby("region") devuelve un objeto GroupBy, que contiene la información de agrupación. No es una tabla de resumen. Elige una columna y llama a un método para calcular un resultado:
g = sales.groupby("region")
totals = g["units"].sum()
East contiene las filas 3 y 5, por lo que su total es 5 + 3 = 8. North contiene las filas 0, 2 y 6, lo que da 10 + 7 + 6 = 23. South contiene las filas 1, 4 y 7, lo que da 4 + 9 + 8 = 21. pandas combina estos resultados en una Series llamada units, con los nombres de las regiones como índice. Los totales suman 52, el total de la columna original.
El orden de salida predeterminado es East, North, South porque las claves de grupo se ordenan. sales.groupby("region", sort=False) utiliza el orden de primera aparición: North, South, East. Ninguna de las dos opciones ordena las observaciones dentro de un grupo ni modifica sales.
Inspecciona y selecciona
g.ngroups es 3. g.size() indica 2, 3 y 3 filas para East, North y South. g.groups relaciona las claves con las etiquetas de fila y g.get_group("North") devuelve las tres filas de North. Puedes inspeccionar un grupo a la vez:
for name, group in g:
print(name, group["units"].tolist())
El recorrido ayuda a inspeccionar o exportar grupos. Para calcular un estadístico, un método agrupado incorporado evita que tengas que escribir un bucle de Python y recopilar los resultados.
Seleccionar g["units"] produce un SeriesGroupBy; su suma es una Series. Seleccionar g[["units"]] produce un DataFrameGroupBy; su suma es un DataFrame de una columna. Selecciona g[["units", "revenue"]] cuando necesites ambas columnas numéricas.
Elige la forma de salida
Una agregación como sum da un valor de resumen por grupo y columna. Una transformación da un valor por cada fila de entrada, como la proporción que representa cada pedido en el total de su región. Un filtrado conserva las filas o grupos seleccionados. El método general apply gestiona resultados de grupo menos regulares.
Filtrar con sales[sales["region"] == "North"] recupera las filas de una región. Agrupar te permite procesar todas las regiones con la misma operación.
Puntos clave
- Las claves de grupo determinan qué filas pertenecen al mismo grupo.
- Un objeto GroupBy necesita una operación antes de producir un resultado.
- Elige entre agregación, transformación o filtrado según la salida que necesites.
- La agrupación conserva la tabla original y el orden de las filas dentro de cada grupo.
1.2 Agrupa por columnas, arreglos, correspondencias, funciones y niveles del índice
Las claves pueden proceder de columnas, cálculos o del índice de filas. La pregunta importante es qué valor recibe cada fila como clave. Las filas con la misma combinación de claves se procesan juntas.
Utiliza varias columnas
Pasa una lista de nombres de columnas para agrupar por combinaciones:
pair_totals = sales.groupby(["region", "product"])["units"].sum()
El resultado tiene un MultiIndex de dos niveles. Sus entradas son East–coffee 5, East–tea 3, North–coffee 7, North–tea 16, South–coffee 17 y South–tea 4. North–tea combina los dos pedidos de té, con 10 y 6 unidades. Agrupar solo por región también incluiría el pedido de café de North.
pair_totals.unstack() mueve el nivel interno product a las columnas. Las filas son regiones y las columnas son coffee y tea. Una combinación ausente se convierte en NaN; unstack(fill_value=0) puede representarla como cero cuando esa ausencia significa que no hay unidades.
Utiliza una lista para varios nombres de columnas. groupby(("region", "product")) trata la tupla como una sola etiqueta de columna y busca una columna cuyo nombre sea esa tupla.
Deriva una clave a partir de valores
Una Series booleana puede dividir los pedidos por tamaño sin añadir una columna:
sales.groupby(sales["units"] >= 7)["revenue"].sum()
El grupo True contiene las unidades 10, 7, 9 y 8; sus ingresos son 126. El grupo False contiene los otros cuatro pedidos y tiene ingresos de 59. La condición crea etiquetas de grupo; no elimina los pedidos más pequeños.
Una correspondencia puede combinar regiones en zonas:
zones = {"North": "Zone 1", "East": "Zone 1", "South": "Zone 2"}
zone_key = sales["region"].map(zones)
sales.groupby(zone_key)["units"].sum()
Zone 1 recibe las 23 unidades de North y las 8 de East, que suman 31. Zone 2 recibe las 21 de South. Aplica primero la correspondencia a la columna: un diccionario pasado directamente a groupby establece correspondencias con las etiquetas del índice, no con los valores de región.
Agrupa mediante el índice
Una función pasada como clave también recibe etiquetas del índice. Para las existencias indexadas por códigos de producto, la primera letra puede identificar la familia de productos:
stock = pd.Series([12, 8, 5, 9, 4],
index=["T01", "T02", "C01", "C02", "C03"])
stock.groupby(lambda code: code[0]).sum()
El total de C es 18 y el de T es 20. Para un MultiIndex existente, pair_totals.groupby(level="product").sum() vuelve a agrupar por el nivel del índice indicado por nombre, produciendo coffee 29 y tea 23.
Comprueba la alineación antes de agrupar
Una clave de arreglo de NumPy proporciona etiquetas por posición y debe tener un elemento por fila. Una Series de claves se alinea por etiqueta de índice. Si sus etiquetas solo cubren las filas 0 y 1, las demás reciben claves faltantes y se excluyen con el comportamiento de agrupación predeterminado. Una Series reordenada puede seguir agrupando correctamente cuando sus etiquetas coinciden; sustituirla por sus valores cambia la operación a un emparejamiento por posición.
Puntos clave
- Utiliza una lista de nombres de columnas para agrupar por combinaciones.
- Una Series de claves se alinea por etiqueta de índice; un arreglo proporciona valores por posición.
- Aplica la correspondencia a los valores de una columna antes de agrupar cuando un diccionario describa esos valores.
- Las funciones pasadas como claves reciben etiquetas del índice.
- Utiliza
levelpara los niveles del índice yunstackpara mover un nivel del índice a las columnas. - Una clave booleana separa las filas en grupos basados en una condición sin eliminar ninguno de los grupos.
1.3 Controla las claves de grupo, el orden y las claves faltantes en los resultados
Un cálculo agrupado tiene dos partes que inspeccionar: los valores y las etiquetas que los acompañan. pandas te permite elegir dónde aparecen las claves, cómo se ordenan los grupos y si las claves faltantes o no utilizadas aparecen en el informe.
Conserva las claves en el índice o en columnas
De forma predeterminada, las claves se convierten en el índice del resultado:
sales.groupby("region")["revenue"].sum()
Esta Series tiene East 29, North 76 y South 80. Para un informe plano, utiliza:
report = sales.groupby("region", as_index=False)["revenue"].sum()
report tiene las columnas normales region y revenue y un nuevo índice de enteros. Llamar a .reset_index() sobre la Series original produce la misma estructura. Con varias claves, convierte cada nivel del MultiIndex en una columna. unstack() tiene otro propósito: mueve un nivel del índice a las columnas de una cuadrícula.
Una Series resultante conserva el nombre de la columna seleccionada. Utiliza .rename("total_revenue") para dar un nombre más claro a la Series o .to_frame("total_revenue") para obtener un DataFrame de una columna. La agregación con nombres de salida puede proporcionar nombres descriptivos para las columnas durante el cálculo.
Ordena las claves o los valores
sort=True ordena las claves, por lo que el orden alfabético de las regiones sigue siendo East, North, South aunque South tenga los mayores ingresos. Para ordenar los totales, ordena el resultado:
sales.groupby("region")["revenue"].sum().sort_values(ascending=False)
La salida es South 80, North 76, East 29. Utiliza sort=False para conservar el orden de primera aparición de las claves y evitar una ordenación innecesaria en un conjunto de datos grande. Esto no ordena las filas dentro de los grupos.
Ten en cuenta las claves faltantes
La opción predeterminada dropna=True excluye las filas con una clave de grupo faltante. Añade un pedido con 5 unidades pero sin región: el total de la columna completa de unidades es ahora 57, mientras que los totales agrupados siguen sumando 52. La fila omitida no tiene una región indicada.
sales.groupby("region", dropna=False)["units"].sum()
En la tabla ampliada, esto añade un grupo de claves faltantes que suma 5. Las claves faltantes determinan si una fila entra en un grupo; los valores faltantes determinan qué cuenta o calcula una agregación dentro de un grupo. Son decisiones distintas.
Muestra las categorías no utilizadas cuando sea necesario
Una columna categórica region puede incluir East, North, South y West aunque no haya pedidos de West. Desde pandas 3.0, observed=True es la opción predeterminada y muestra solo las categorías presentes en los datos. Con observed=False, también aparece West: su suma y su recuento son 0, mientras que su media es NaN.
Elige esta opción explícitamente cuando un informe deba mostrar las mismas categorías cada vez. Una categoría no utilizada y una clave faltante son diferentes: observed gestiona los valores categóricos declarados; dropna gestiona los valores de clave ausentes.
as_index y sort configuran los resultados de las agregaciones. Las transformaciones y los filtrados como head, nth y filter conservan los índices de las filas de entrada. Para un informe de sumas, comparar la suma de los totales de grupo con el total de la columna original puede revelar claves excluidas o un filtro anterior.
Puntos clave
as_index=Falsecoloca las claves de agregación en columnas normales.sortordena las claves;sort_valuesordena los valores calculados.dropna=Falseconserva un grupo para las claves faltantes.observed=Falseincluye los valores categóricos no utilizados.
2Resume cada grupo mediante agregaciones
Una tabla de resumen convierte muchas observaciones en unas pocas medidas útiles. Los recuentos, totales, medias y medidas de dispersión responden a preguntas diferentes, aunque utilicen los mismos grupos. Elegirás las funciones incorporadas adecuadas, reunirás varios resultados en una llamada y escribirás una función personalizada cuando sea necesario. Los valores faltantes y los tamaños desiguales de los grupos importan: una tabla ordenada puede seguir respondiendo a la pregunta equivocada.
2.1 Utiliza correctamente los métodos de agregación incorporados
Una agregación reduce cada grupo a un valor de resumen para cada columna seleccionada. Elige la medida según la pregunta: un recuento de filas, un total, una media o una medida de variación describe una característica diferente de los datos.
Selecciona el estadístico
Entre los métodos habituales se encuentran sum, prod, mean, median, min, max, count, size, nunique, std, var, first, last y quantile. Tanto una llamada directa como .mean() como .agg("mean") solicitan una media de grupo de pandas. nunique() cuenta los valores distintos presentes de forma predeterminada.
sales.groupby("product")["revenue"].agg(["mean", "median"])
Los ingresos por café son 28, 20, 36 y 32. Su media es 29; al ordenarlos se obtienen los valores centrales 28 y 32, por lo que su mediana es 30. Los ingresos por té son 30, 12, 9 y 18. Su media es 17,25 y su mediana 15. El pedido grande de té de 30 eleva la media por encima de la mediana.
Cuenta filas o valores registrados
size() cuenta filas. count() cuenta los valores presentes en cada columna seleccionada. Si faltan las unidades de la fila 2 de North y de la fila 5 de East, los tamaños siguen siendo East 2, North 3, South 3, pero los recuentos de unidades son 1, 2 y 3. Por tanto, distintas columnas pueden tener distintos recuentos dentro del mismo grupo.
La mayoría de las reducciones numéricas omiten los valores faltantes. Las unidades restantes de North, 10 y 6, tienen una media de 8, calculada con dos valores registrados. Dividir su suma por las tres filas daría una media incorrecta. Un grupo con todos sus valores faltantes tiene una suma de 0 de forma predeterminada, pero una media NaN. Desde pandas 3.0, las reducciones como sum y mean aceptan skipna=False para devolver un resultado faltante cuando un grupo contiene un valor faltante.
Interpreta la dispersión y los resúmenes combinados
std() y var() utilizan estadísticos muestrales, con ddof=1: el divisor es uno menos que el número de observaciones registradas. Los valores 1 y 3 tienen una desviación estándar muestral de aproximadamente 1,414. Un grupo con el único valor 5 tiene una desviación estándar muestral NaN.
describe() reúne el recuento, la media, la desviación estándar, el mínimo, los cuartiles y el máximo. Para los ingresos de South 12, 36 y 32, la media es aproximadamente 26,67 y la mediana es 32. La columna del 50 % es la mediana.
Controla las columnas y el orden de las filas
Seleccionar columnas numéricas evita intentar calcular la media de texto:
sales.groupby("region")[["units", "revenue"]].mean()
Una llamada a .mean() sobre toda la tabla falla en la columna de texto product; numeric_only=True es otra solución. Una llamada a .sum() sobre toda la tabla puede concatenar texto y producir "coffeetea" para East, lo que no es un resumen útil de productos.
first() y last() eligen el primer y el último valor presente por columna en el orden actual de las filas. Pueden tomar valores de filas distintas. Utiliza nth(0) para recuperar la primera fila real, incluidos sus valores faltantes; ordena primero cuando «primero» signifique el más temprano.
Los tamaños desiguales de los grupos también afectan a la interpretación. Las medias regionales de ingresos dan un promedio de aproximadamente 22,17, pero la media general es 185 dividido entre 8, o 23,125. Dar el mismo peso a cada media regional otorga al grupo East de dos filas tanta influencia como a cada grupo de tres filas.
Puntos clave
sizecuenta filas;countcuenta valores registrados.- La mayoría de las reducciones omiten los valores faltantes; la suma de un grupo con todos sus valores faltantes es cero de forma predeterminada.
stdyvarutilizan el divisor muestral de forma predeterminada.- Selecciona las columnas numéricas pertinentes antes de agregar.
firstpuede omitir valores faltantes;nth(0)selecciona una fila real.- Los grupos de distinto tamaño necesitan pesos adecuados al combinar sus medias.
2.2 Aplica varias agregaciones a la vez con agg
Un informe útil suele necesitar varias medidas de los mismos grupos. agg, abreviatura de aggregate, te permite solicitar esas medidas juntas y controlar cómo se nombran sus columnas de salida.
Aplica varias funciones a una columna
sales.groupby("region")["revenue"].agg(["sum", "mean", "max"])
East da 29; 14,5 y 20; North da 76; aproximadamente 25,33 y 30; South da 80; aproximadamente 26,67 y 36. Cada fila representa una región, mientras que los nombres de las funciones se convierten en nombres de columnas.
Una lista aplicada a varias columnas de valores produce columnas jerárquicas:
result = sales.groupby("region")[["units", "revenue"]].agg(["sum", "mean"])
Las cuatro etiquetas de columna son los pares ("units", "sum"), ("units", "mean"), ("revenue", "sum") y ("revenue", "mean"). El primer nivel identifica la columna de entrada; el segundo identifica el cálculo. Estos son niveles de columna, independientes de los niveles de agrupación del índice de filas.
Asigna funciones a columnas específicas
Un diccionario selecciona las columnas de entrada y sus funciones:
sales.groupby("region").agg({
"units": "sum",
"revenue": ["mean", "max"]
})
Esto solicita el total de unidades, pero la media y el máximo de ingresos. Las columnas ausentes del diccionario no aparecen. Distintas funciones pueden tener sentido para distintas medidas; sumar una cantidad y calcular la media de una tasa no son opciones intercambiables.
Asigna nombres directamente a las salidas
La agregación con nombres de salida da a cada resultado un nombre explícito:
report = sales.groupby("region").agg(
total_units=("units", "sum"),
avg_revenue=("revenue", "mean")
)
Cada argumento con nombre asigna un nombre a una columna de salida. Su tupla contiene la columna de origen y la función. total_units es 8, 23 y 21; avg_revenue es 14,5; aproximadamente 25,33 y aproximadamente 26,67. pd.NamedAgg(column="units", aggfunc="sum") es una alternativa para especificar el origen y la función.
Después de seleccionar una sola Series, utiliza argumentos con nombre para las funciones, sin tuplas de columna de origen:
sales.groupby("region")["units"].agg(total="sum", most="max")
Los totales son 8, 23 y 21, y los máximos 5, 10 y 9. Un diccionario como {"total": "sum"} sobre esta Series seleccionada genera un SpecificationError; no es la forma de diccionario utilizada en un DataFrame.
Una lista de pares con nombre también funciona en una columna seleccionada: .agg([("average", "mean"), ("spread", "std")]). Si ya tienes columnas MultiIndex creadas a partir de etiquetas de texto, result.columns = ["_".join(col) for col in result.columns] las aplana y produce nombres como units_sum.
Elige la función de forma deliberada
Los nombres de cadena utilizan los cálculos de grupo incorporados de pandas. Desde pandas 3.0, una función de NumPy o Python pasada a agg se llama tal como se proporciona. Para los ingresos de East 20 y 9, "std" utiliza el divisor muestral y da aproximadamente 7,78, mientras que np.std utiliza el divisor poblacional y da 5,5.
Puntos clave
- Una lista aplica varias funciones a las columnas seleccionadas.
- Un diccionario asigna funciones a determinadas columnas de entrada.
- La agregación con nombres de salida utiliza nombres de salida con pares
(column, function). - Los nombres de funciones como cadenas y los objetos invocables de NumPy pueden usar distintos valores estadísticos predeterminados.
2.3 Escribe funciones de agregación personalizadas
Una agregación personalizada expresa un resumen que no proporciona un nombre de función incorporada. Su función recibe los valores de un grupo como una Series y debe reducirlos a un resultado útil.
Escribe y pasa la función
def value_range(s):
return s.max() - s.min()
sales.groupby("region")["revenue"].agg(value_range)
El rango de East es 20 menos 9, o 11. El de North es 30 menos 18, o 12. El de South es 36 menos 12, o 24. Pasa la propia función value_range; value_range() la llamaría inmediatamente sin la Series de grupo que necesita.
Una expresión lambda es adecuada para un cálculo breve:
sales.groupby("region")["revenue"].agg(
share_20=lambda s: (s >= 20).mean()
)
Los valores booleanos actúan como 1 para True y 0 para False, por lo que su media es la proporción que cumple la condición. East tiene un pedido que cumple la condición de dos, o 0,5. North y South tienen cada una dos de tres, o aproximadamente 0,667. Dar un nombre al resultado hace que su significado sea más claro que una etiqueta automática de lambda. Las listas con varias funciones etiquetan las expresiones lambda como <lambda_0>, <lambda_1> y así sucesivamente; una sola expresión lambda en una lista recibe la etiqueta <lambda>.
Prepara columnas para utilizar reducciones rápidas
Una función de Python se ejecuta una vez por cada grupo. Cuando hay muchos grupos, las reducciones incorporadas suelen ser más rápidas. El cálculo de la proporción puede reescribirse creando primero su columna booleana:
sales.assign(big=sales["revenue"] >= 20).groupby("region")["big"].mean()
La comparación se ejecuta sobre toda la columna y pandas calcula las medias de grupo.
Combina dos columnas mediante sus totales
Una función de agg procesa una columna a la vez. Para obtener el ingreso medio por unidad, resume primero ambas columnas:
totals = sales.groupby("region")[["units", "revenue"]].sum()
avg_price = totals["revenue"] / totals["units"]
Los resultados son East 29/8 = 3,625, North 76/23 ≈ 3,304 y South 80/21 ≈ 3,810. Cada unidad recibe el mismo peso. Calcular la media de los precios por pedido da, en cambio, East 3,5, North aproximadamente 3,333 y South aproximadamente 3,667, porque cada pedido recibe el mismo peso independientemente de su tamaño. Decide si la pregunta se refiere a una unidad típica o a un pedido típico antes de elegir la fórmula.
Ten claros el valor devuelto y los datos faltantes
Una función que devuelve los dos valores más pequeños no crea dos filas de resumen normales mediante agg; en pandas 3.1, lambda s: s.nsmallest(2) almacena un objeto de tipo lista en cada celda. Utiliza apply cuando un grupo deba devolver varios valores o filas.
La Series de entrada sigue conteniendo los valores faltantes. s.mean() los omite, mientras que len(s) cuenta sus filas. Si faltan las unidades en las filas 2 y 5, .agg(len) da tamaños de grupo 2, 3 y 3, no recuentos de valores presentes 1, 2 y 3.
Los argumentos adicionales pueden ir después de la función: .agg("quantile", 0.9) da el percentil 90 de cada grupo. Los ingresos de East 9 y 20 dan 18,9 mediante interpolación lineal. La llamada directa .quantile(0.9) es más fácil de leer para esta única operación.
Puntos clave
- Pasa una función a
aggsin llamarla primero. - Una agregación personalizada recibe la Series de un grupo y debe devolver un valor de resumen.
- Las medias de valores booleanos dan proporciones.
- Un cociente de totales pondera las unidades de forma distinta que una media de cocientes por fila.
- Prefiere las reducciones incorporadas cuando expresen el cálculo.
- Las funciones personalizadas deben tratar los valores faltantes de forma deliberada.
3Transforma, filtra y aplica funciones grupo a grupo
Un grupo puede proporcionar contexto para cada fila original, además de un resumen independiente. Un pedido puede recibir el total de su región, su rango o la variación respecto al pedido anterior de esa región. Otras tareas conservan grupos seleccionados o devuelven una tabla de cada grupo. Elegir un método según la forma de su salida hace que este trabajo sea más claro y evita errores de alineación de índices al añadir un resultado a los datos originales.
3.1 Añade estadísticos del grupo a cada fila con transform
Un resumen tiene una fila por grupo, pero a veces cada fila original necesita el estadístico de su grupo. transform devuelve un resultado con la longitud y el índice originales, por lo que resulta adecuado para una columna nueva.
Difunde un total a las filas correspondientes
g = sales.groupby("region")["revenue"]
regional_total = g.transform("sum")
sales["share"] = sales["revenue"] / regional_total
La Series de totales contiene 76, 80, 76, 29, 80, 29, 76 y 80 en el orden original de las filas. El total de North, 76, se repite solo en las filas de North. La fila 0 recibe una proporción de 30/76 ≈ 0,395; la fila 3 de East recibe 20/29 ≈ 0,690. Dentro de cada región, estas proporciones de ingresos suman 1.
Asignar g.sum() directamente no lograría emparejar las filas. Su índice contiene nombres de regiones, mientras que sales tiene etiquetas de fila de 0 a 7. pandas alinea por etiqueta de índice, por lo que la columna asignada queda con valores faltantes. Utiliza transform o combina explícitamente un resumen mediante region.
Compara una fila con su grupo
Restar la media del grupo da una desviación respecto a la media del grupo:
x = sales["revenue"]
deviation = x - g.transform("mean")
La fila 0 de North está aproximadamente 4,67 por encima de la media de su grupo, que es aproximadamente 25,33. La fila 1 de South está aproximadamente 14,67 por debajo de la media de su grupo, que es aproximadamente 26,67. Cada comparación utiliza la región propia de la fila, no la media de toda la tabla.
Una puntuación z divide esa desviación por la desviación estándar del grupo:
z = (x - g.transform("mean")) / g.transform("std")
Para la fila 0 de North, la desviación estándar muestral es aproximadamente 6,43 y la puntuación z aproximadamente 0,73. La fila 3 de East tiene una puntuación z de aproximadamente 0,71, por lo que está por encima de la media de su región aunque sus ingresos de 20 estén por debajo de la media general de 23,125. Una desviación estándar de cero o un número insuficiente de valores registrados deja la puntuación estandarizada sin definir.
Rellena un valor faltante a partir de su grupo
Supón que faltan las unidades de las filas 2 y 5. Las unidades registradas de North son 10 y 6, con media 8; el único valor de unidades registrado de East es 5.
with_missing = sales.copy()
with_missing.loc[[2, 5], "units"] = np.nan
means = with_missing.groupby("region")["units"].transform("mean")
filled_units = with_missing["units"].fillna(means)
En esa tabla modificada, la fila 2 recibe 8 y la fila 5 recibe 5. Los valores existentes permanecen sin cambios. Cuando los grupos tienen valores típicos diferentes, sus propias medias pueden ofrecer sustituciones más realistas que una sola media general. Un grupo sin valores registrados sigue sin tener una media que proporcionar.
Comprende una transformación personalizada
Una función proporcionada a transform puede devolver un escalar, que pandas repite dentro del grupo, o una Series indexada según las filas del grupo. Por ejemplo, g.transform(lambda s: s - s.mean()) calcula las mismas desviaciones que la media incorporada seguida de una resta, pero invoca Python para cada grupo.
Una Series devuelta más corta se empareja por etiqueta. g.transform(lambda s: s.head(1)) proporciona solo el valor de la primera fila de cada grupo; las demás filas reciben NaN. Conserva el índice original en los cálculos por fila cuando vayas a asignar el resultado de nuevo a la tabla.
Puntos clave
transformdevuelve resultados alineados con las filas de entrada.- Divide cada valor por el total transformado de su grupo para obtener proporciones dentro del grupo.
- Utiliza las medias y desviaciones estándar de los grupos para comparar valores dentro de cada grupo.
- El relleno basado en grupos utiliza el estadístico del grupo al que pertenece la fila con el valor faltante.
3.2 Calcula sumas acumuladas, rangos y variaciones dentro de los grupos
Los cálculos acumulados y las comparaciones con observaciones anteriores necesitan tanto un grupo como un orden de filas. La agrupación evita que un cálculo pase a otro grupo; la ordenación determina qué significan «anterior» o «hasta ese momento».
Acumula dentro de cada grupo
Supón que las filas de pedidos ya están en orden temporal:
sales["running_units"] = sales.groupby("region")["units"].cumsum()
Las unidades de North 10, 7 y 6 producen sumas acumuladas de 10, 17 y 23. Las de South 4, 9 y 8 producen 4, 13 y 21. Las de East 5 y 3 producen 5 y 8. Estos valores permanecen asociados a sus etiquetas de fila originales, por lo que la salida completa en orden de filas es 10, 4, 17, 5, 13, 8, 23 y 21.
Sin groupby, sales["units"].cumsum() daría una sola suma acumulada para todos los pedidos: 10, 14, 21, 26, 35, 38, 44 y 52. El cálculo agrupado se reinicia para cada región. Entre los métodos relacionados están cumprod, cummax y cummin para productos, máximos y mínimos acumulados.
cumcount() cuenta las posiciones dentro de los grupos desde cero. Aquí da 0, 0, 1, 0, 1, 1, 2 y 2. Suma 1 para obtener los números de primer, segundo y tercer pedido dentro de cada región.
Asigna rangos sin reorganizar las filas
sales.groupby("region")["revenue"].rank(ascending=False)
El mayor ingreso recibe el rango 1 en su propia región: la fila 0 de North, la fila 4 de South y la fila 3 de East. La salida conserva el índice de entrada; asignar rangos no mueve las filas mayores a la parte superior de la tabla.
De forma predeterminada, los valores empatados reciben la media de sus rangos. Si dos valores empatan en el primer puesto, ambos obtienen 1,5 y el siguiente obtiene 3. method="min" da 1 a los valores empatados y sigue dando 3 al siguiente. method="dense" da 1 a los valores empatados y 2 al siguiente. Elige una regla de desempate que se ajuste a cómo se interpretarán los rangos.
Compara valores consecutivos
g = sales.groupby("region")["units"]
previous = g.shift(1)
change = g.diff()
relative_change = g.pct_change()
Los valores anteriores de North son un valor faltante, 10 y 7. Sus diferencias son un valor faltante, −3 y −1. Sus variaciones relativas son un valor faltante, −0,3 y aproximadamente −0,143: la diferencia se divide por el valor anterior. pct_change() devuelve una fracción, por lo que −0,3 significa una disminución del 30 %, no del 0,3 %.
La primera observación de cada grupo no tiene una observación anterior y recibe NaN. Un shift() aplicado a la columna sin agrupar usaría la fila anterior de toda la tabla, que podría pertenecer a otra región.
Antes de estos cálculos ordenados, ordena las filas por la columna que define la secuencia, como una fecha o un número de evento. groupby(sort=True) ordena solo las claves de grupo; no puede colocar las observaciones en orden cronológico. La asignación de rangos compara valores y trata los empates independientemente de la cronología, mientras que los cálculos acumulados y con valores rezagados dependen de la secuencia elegida.
Puntos clave
- Ordena las observaciones antes de realizar cálculos que dependen de su secuencia.
- Los métodos acumulativos agrupados se reinician dentro de cada grupo.
cumcountcomienza en cero; suma 1 para obtener números de secuencia habituales.- Elige explícitamente la dirección del rango y el método para los empates cuando sea necesario.
shift,diffypct_changecomparan observaciones dentro del mismo grupo.pct_changedevuelve una fracción que puede multiplicarse por 100 para obtener un porcentaje.
3.3 Conserva, elimina o selecciona muestras de filas grupo a grupo
Conservar un grupo y resumirlo son operaciones distintas. Un filtro de grupos utiliza una condición aplicada a todo el grupo para decidir qué filas originales permanecen; los métodos de selección de filas eligen observaciones concretas de cada grupo.
Conserva grupos completos
sales.groupby("region").filter(lambda g: len(g) >= 3)
North y South tienen tres pedidos cada una, mientras que East tiene dos. El resultado contiene las filas 0, 1, 2, 4, 6 y 7, en su orden y con sus etiquetas originales. No devuelve dos filas de resumen regional.
La condición debe producir un único valor booleano por cada grupo. lambda g: g["units"] > 5 produce una Series booleana y no es válida para filter. Reduce esa condición con all() o any():
sales.groupby("region").filter(lambda g: (g["units"] > 5).all())
Solo North cumple la condición, porque todos sus valores de unidades, 10, 7 y 6, superan 5. Usar any() también conserva South porque al menos uno de sus pedidos supera 5.
Un tamaño de grupo transformado proporciona una máscara más rápida y alineada con las filas para la primera tarea:
sizes = sales.groupby("region")["units"].transform("size")
sales[sizes >= 3]
Esta máscara puede combinarse con otras condiciones por fila mediante & y |. Filtrar sales.groupby("region")["revenue"].sum() conservaría, en cambio, entradas de resumen y no los pedidos originales.
Toma filas por posición
head(n) toma las primeras n filas por grupo, tail(n) las últimas n y nth(k) la fila en la posición k contando desde cero. sales.groupby("region").head(1) devuelve las filas 0, 1 y 3: el primer pedido observado de cada región. Los valores faltantes no hacen que head(1) busque una fila posterior sin valores faltantes.
Para seleccionar el pedido más grande de cada región, ordena primero por ingresos:
sales.sort_values("revenue", ascending=False).groupby("region").head(1)
Las filas seleccionadas son la fila 4 de South con ingresos de 36, la fila 0 de North con 30 y la fila 3 de East con 20. La ordenación controla qué observación es la primera; la operación de grupo toma entonces esa primera fila. Con etiquetas de fila únicas, sales.loc[sales.groupby("region")["revenue"].idxmax()] recupera los mismos máximos mediante sus etiquetas.
Selecciona muestras dentro de cada grupo
sales.groupby("region").sample(n=1, random_state=0)
Esto selecciona un pedido de cada región. Establecer random_state hace que las ejecuciones repetidas sobre los mismos datos sean reproducibles. Una muestra de todo el DataFrame podría omitir una región, aunque tenga tres filas en total.
Utiliza frac=0.5 para seleccionar aproximadamente la mitad de las filas de cada grupo. El tamaño de la muestra por grupo se redondea: con frac=0.2, las dos filas de East dan 0,4 filas, que se redondean a cero. Utiliza un n=1 explícito cuando cada grupo no vacío deba aportar una observación. El tamaño de muestra solicitado debe ser viable para los grupos con la configuración de muestreo elegida.
Puntos clave
filterdevuelve las filas originales de los grupos que cumplen su condición booleana única.head,tailynthseleccionan filas en el orden actual.- Ordena antes de usar
headpara seleccionar los valores mayores. - El muestreo agrupado con
n=1representa a cada grupo no vacío; una fracción pequeña puede omitir grupos pequeños.
3.4 Ejecuta operaciones generales por grupos con apply
apply permite que una función examine un grupo completo y devuelva un escalar, una Series o un DataFrame. Esa flexibilidad es útil cuando las columnas deben interactuar o el resultado contiene varias filas. También hace que la forma del resultado sea menos predecible que con agg o transform.
Utiliza varias columnas juntas
def price_per_unit(g):
return g["revenue"].sum() / g["units"].sum()
sales.groupby("region").apply(price_per_unit)
La función recibe las filas de una región. Devuelve un valor, por lo que pandas combina las salidas en una Series indexada por región: East 3,625, North aproximadamente 3,304 y South aproximadamente 3,810. Un cociente de sumas agrupadas incorporadas produce el mismo resultado con menos sobrecarga de Python. np.average(g["revenue"] / g["units"], weights=g["units"]) expresa la media ponderada equivalente.
Para un estadístico que involucra dos columnas, como la correlación entre horas de estudio y calificación dentro de cada grupo de clase, apply puede pasar las dos Series de cada grupo a .corr().
Predice cómo se combinan las salidas
Una función que devuelve una Series con las mismas etiquetas para cada grupo crea una fila de tabla por grupo:
sales.groupby("region").apply(
lambda g: pd.Series({
"orders": len(g),
"avg_price": g["revenue"].sum() / g["units"].sum()
})
)
Las columnas son orders y avg_price. Los recuentos aparecen como 2,0; 3,0 y 3,0 porque la Series devuelta también contiene un precio de coma flotante. Si las Series devueltas utilizan etiquetas distintas, pandas las apila en una Series más larga y añade las claves de grupo como nivel externo del índice.
Un DataFrame por grupo se apila en un DataFrame mayor:
def top(g, n=2, col="revenue"):
return g.sort_values(col, ascending=False).head(n)
sales.groupby("region").apply(top)
Las filas son East 3 y 5, North 0 y 2, y South 4 y 7. Cada grupo se ordena por separado. Los argumentos adicionales van después de la función: .apply(top, n=1, col="units") cambia la selección al pedido con más unidades.
Controla las claves y la alineación
Para estas filas devueltas, la opción predeterminada group_keys=True añade la región como nivel externo del índice. sales.groupby("region", group_keys=False).apply(top) conserva solo las etiquetas de fila originales. Sigue reuniendo los resultados grupo a grupo; no garantiza el orden de las filas de la tabla de entrada.
Desde pandas 3.0, el DataFrame que se pasa a un apply agrupado excluye las columnas de agrupación. En este ejemplo tiene product, units y revenue, pero no region. Lee la clave del grupo actual desde g.name cuando la función la necesite.
Utiliza el método más específico cuando sea adecuado
apply ejecuta código Python para cada grupo e infiere cómo reunir la salida. Utiliza agg para valores de resumen por columna, transform para resultados alineados con cada fila de entrada y filter para decidir si se conserva o elimina cada grupo completo.
Por ejemplo, restar la media de cada región mediante apply sobre una Series seleccionada devuelve las diferencias bajo un MultiIndex de región y fila. transform devuelve las diferencias con el índice original y están listas para asignarse como columna.
Puntos clave
applypuede utilizar varias columnas y devolver resultados con formas flexibles.- Un resultado escalar da una Series; las etiquetas coincidentes de las Series dan una tabla.
- Los resultados DataFrame se apilan, normalmente con las claves de grupo en el índice.
- Desde pandas 3.0,
applyagrupado excluye las columnas de agrupación de cada grupo de entrada. - Prefiere
agg,transformofiltercuando su forma de resultado sea adecuada. - Utiliza
group_keyspara controlar las etiquetas externas de grupo, no para restablecer el orden original de las filas.
4Agrupa datos numéricos en intervalos y analiza grupos por intervalos y cuantiles
Los valores numéricos pueden convertirse en etiquetas de grupo útiles cuando los divides en intervalos. Los límites fijos permiten comparar los mismos rangos entre informes; los cuantiles permiten comparar las partes inferior y superior de una muestra. Crearás ambos tipos de intervalos, inspeccionarás los límites y los empates, y resumirás otra variable dentro de ellos. Los recuentos junto a los resúmenes te ayudan a ver cuántos datos respaldan cada comparación.
4.1 Agrupa valores en intervalos con cut
La agrupación en intervalos, también llamada discretización, sustituye los valores numéricos por categorías de intervalos. Utilízala cuando un informe necesite rangos significativos, como tramos de calificaciones, en lugar de un grupo separado para cada número.
Establece límites explícitos
scores = pd.Series([42, 50, 55, 64, 68, 70, 73, 81, 85, 88, 97, 100])
bands = pd.cut(scores, [0, 50, 70, 85, 100])
bands.value_counts(sort=False)
Cinco límites definen cuatro intervalos: (0, 50], (50, 70], (70, 85] y (85, 100]. Contienen 2, 4, 3 y 3 calificaciones. Los límites explícitos pueden definir intervalos de amplitudes distintas porque describen límites significativos.
Un paréntesis excluye un extremo y un corchete lo incluye. Con la opción predeterminada right=True, 50 pertenece al primer intervalo, 70 al segundo, 85 al tercero y 100 al cuarto. Lee (50, 70] como «mayor que 50 y como máximo 70».
Gestiona los límites exteriores
Con estos límites explícitos, 0 queda excluido del primer intervalo y 101 queda fuera del último. Ambos reciben NaN. Utiliza include_lowest=True para incluir un valor igual al límite inferior. Los valores por debajo del límite inferior o por encima del superior siguen sin recibir intervalo.
Para intervalos cerrados por la izquierda, utiliza right=False. Los mismos límites definen entonces [0, 50), [50, 70), [70, 85) y [85, 100). Ahora 50 pasa al segundo intervalo y 100 queda excluido. Los recuentos del ejemplo pasan a ser 1, 4, 3 y 3, con una asignación de intervalo faltante. Un límite superior de 101 incluiría la calificación 100 en el último intervalo cerrado por la izquierda.
Cambiar el cierre cambia la pertenencia en un límite. Comprueba un mínimo, un límite interno y un máximo antes de utilizar los tramos en un informe.
Añade etiquetas legibles
bands = pd.cut(
scores, [0, 50, 70, 85, 100],
labels=["fail", "pass", "merit", "distinction"]
)
Proporciona una etiqueta para cada intervalo: cuatro etiquetas para cinco límites. La salida es una variable categórica ordenada, por lo que su orden es fail, pass, merit, distinction, no el orden alfabético. labels=False devuelve, en cambio, códigos de intervalo de 0 a 3 para los valores asignados.
value_counts() normalmente ordena por frecuencia. Utiliza sort=False u ordena el índice resultante para conservar la secuencia de los intervalos. De lo contrario, el tramo más frecuente puede aparecer primero y dificultar la lectura de la distribución.
Pide a pandas intervalos de igual amplitud
Pasar un entero solicita esa cantidad de intervalos de igual amplitud:
bands, edges = pd.cut(scores, 4, retbins=True)
El rango de 42 a 100 abarca 58, lo que da amplitudes de 14,5. Los límites internos son 56,5; 71,0 y 85,5. pandas amplía ligeramente el extremo inferior para estos intervalos cerrados por la derecha, dando un primer límite de 41,942 para incluir el mínimo. En este caso, cada intervalo contiene tres calificaciones; las amplitudes iguales no producen, en general, recuentos iguales.
retbins=True devuelve los límites reales además de las asignaciones. Los límites explícitos deben estar en orden creciente: [0, 70, 50, 100] no puede definir la secuencia de intervalos deseada.
Puntos clave
cutconvierte valores numéricos en categorías de intervalos.- De forma predeterminada, los intervalos excluyen el límite izquierdo e incluyen el derecho.
- Los límites explícitos dejan sin asignar los valores fuera del rango.
include_lowest=Trueincluye el límite explícito inferior.- Un número entero de intervalos solicita amplitudes iguales, no recuentos iguales.
- Las etiquetas y los recuentos deben conservar el orden previsto de los intervalos.
right=Falsecambia qué extremo pertenece a cada intervalo; comprueba el máximo después de cambiar el cierre.
4.2 Crea intervalos con igual número de observaciones mediante cuantiles y qcut
Un cuantil describe una posición en los datos ordenados. La mediana es el cuantil 0,5; los cuartiles dividen la distribución en cuartos, los deciles en décimas partes y los percentiles en centésimas partes. qcut utiliza los cuantiles muestrales como límites de los intervalos.
Calcula un cuantil
Para las calificaciones 42, 50, 55, 64, 68, 70, 73, 81, 85, 88, 97 y 100:
scores.quantile([0.25, 0.5, 0.75])
Los resultados son 61,75; 71,5 y 85,75. pandas utiliza interpolación lineal de forma predeterminada. Para el cuantil 0,25, la posición contando desde cero es:
La posición 2 contiene 55 y la posición 3 contiene 64. Avanza tres cuartas partes de la distancia entre ambos:
Por tanto, un cuantil muestral puede estar entre valores observados. No tiene por qué ser igual a una calificación que alguien haya obtenido.
Crea grupos de cuantiles
quartile = pd.qcut(scores, 4, labels=["Q1", "Q2", "Q3", "Q4"])
Esta muestra da tres calificaciones por grupo de cuartil. Los límites internos son los tres cuartiles calculados. El primer intervalo incluye el mínimo; la visualización del intervalo ajusta su etiqueta inferior ligeramente por debajo de 42. Utiliza labels=False para obtener códigos de 0 a 3, o retbins=True para recuperar los límites numéricos.
Una lista de proporciones controla los rangos de cuantiles. pd.qcut(x, [0, 0.1, 0.5, 0.9, 1]) separa el 10 % inferior, dos partes intermedias divididas por la mediana y el 10 % superior.
Elige entre amplitudes y recuentos
| Método | ¿Qué determina los límites? | ¿Qué se mantiene comparable? |
|---|---|---|
cut(x, n) | Intervalos iguales en todo el rango observado | Amplitud numérica |
cut(x, edges) | Límites explícitos proporcionados | Los rangos elegidos |
qcut(x, n) | Cuantiles de esta muestra | Recuentos aproximados de observaciones |
Los tiempos de entrega de 5, 6, 7, 7, 8, 9, 10, 12, 15, 20, 35 y 60 minutos muestran la diferencia. Tres intervalos de igual amplitud contienen 10, 1 y 1 observaciones. Tres intervalos definidos por cuantiles contienen 4 cada uno, con límites internos de aproximadamente 7,67 y 13 minutos. Las demoras largas amplían el rango dividido en intervalos de igual amplitud y dejan la mayoría de las observaciones en el primer intervalo.
Utiliza límites fijos cuando debas comparar los mismos rangos de tiempo entre conjuntos de datos. Los límites de cuantiles cambian cuando cambia la muestra.
Mantén visibles los empates
Para los valores 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10 y 12, los límites de los cuartiles son 3,75; 6 y 8,25. Ambos valores de 6 pertenecen al mismo intervalo, por lo que los recuentos son 3, 4, 2 y 3. La agrupación en intervalos con igual número de observaciones es aproximada cuando hay valores empatados.
Con muchos empates, los límites de cuantiles pueden coincidir. Para 1, 1, 1, 1, 1, 1, 2 y 3, solicitar cuartiles da límites repetidos. duplicates="drop" elimina los límites duplicados y deja solo dos intervalos, con recuentos de 6 y 2. Asignar rangos primero con rank(method="first") puede forzar cuatro grupos de igual tamaño, pero separa los valores iguales según el orden de las filas. Esto cambia el significado de intervalos de valores a grupos basados en rangos con empates resueltos.
Puntos clave
- Los cuantiles pueden estar entre observaciones porque pandas interpola.
qcututiliza cuantiles muestrales para crear grupos con aproximadamente el mismo número de observaciones.- Utiliza límites fijos con
cutpara rangos que deban seguir siendo comparables entre conjuntos de datos. - Los empates pueden hacer que los recuentos de los intervalos definidos por cuantiles sean desiguales o producir límites duplicados.
- Eliminar límites duplicados reduce el número de intervalos; asignar rangos primero separa los valores empatados.
4.3 Compara grupos definidos por intervalos y cuantiles
Una etiqueta de intervalo puede servir como clave de grupo. Esto te permite preguntar cómo cambia una variable entre los rangos de otra, como la calificación media de examen entre tramos de horas de estudio. El resumen describe las observaciones de cada tramo.
Crea un resumen por intervalos
Crea los datos de estudiantes:
students = pd.DataFrame({
"group": ["day", "evening", "day", "evening", "day", "evening", "day", "evening", "day", "day", "evening", "day"],
"hours": [2, 3, 3, 5, 4, 6, 6, 8, 7, 9, 10, 12],
"score": [42, 50, 55, 64, 68, 70, 73, 81, 85, 88, 97, 100]
})
hour_band = pd.cut(students["hours"], [0, 3, 6, 9, 12])
students.groupby(hour_band)["score"].agg(["count", "mean"])
Los cuatro tramos contienen 3, 4, 3 y 2 estudiantes. Sus calificaciones medias son 49; 68,75; aproximadamente 84,67 y 98,5. En el primer tramo, las calificaciones son 42, 50 y 55; su media es 147/3 = 49. El recuento muestra cuántas calificaciones registradas respaldan cada media.
La Series de tramos tiene una entrada por estudiante y el mismo índice, por lo que sus asignaciones coinciden con las filas durante la agrupación. La columna numérica hours sigue disponible para otros cálculos.
Conserva los intervalos vacíos cuando un informe los necesite
Desde pandas 3.0, observed=True es la opción predeterminada de agrupación para claves categóricas. Añade un límite de 15 y se omitirá el tramo no utilizado (12, 15]. observed=False lo conserva con recuento 0 y media NaN. Cero estudiantes es un recuento; una media de cero sugeriría erróneamente que las calificaciones observadas tienen una media de cero.
Los intervalos son categorías ordenadas, por lo que la salida agrupada normal sigue el orden de intervalos de menor a mayor. Las etiquetas con nombre conservan el orden asignado a sus intervalos.
Analiza grupos de cuantiles y combinaciones
quartile = pd.qcut(students["hours"], 4,
labels=["Q1", "Q2", "Q3", "Q4"])
students.groupby(quartile)["score"].agg(["count", "min", "max", "mean"])
Los recuentos son 3, 4, 2 y 3, con calificaciones medias de 49; 68,75; 83 y 95. Los valores empatados de 6 explican los recuentos desiguales. Para comparar estudiantes de día y de noche dentro de cada cuartil, agrupa por [quartile, "group"] y llama a .mean().unstack(). Las medias de Q1 son day 48,5 y evening 50; las medias de Q4 son day 94 y evening 97.
La dirección del análisis importa. Agrupar las horas de estudio por tramos de calificación responde a otra pregunta: las medias de horas de los tramos fail, pass, merit y distinction son 2,5; 4,5; 7 y aproximadamente 10,33.
Decide qué población define un cuantil
Una división de las calificaciones por la mediana general utiliza 71,5. Una división dentro de cada clase utiliza su propia mediana: day 73 y evening 70.
within_class = students.groupby("group")["score"].transform(
lambda s: pd.qcut(s, 2, labels=["lower", "upper"])
)
El estudiante de day con una calificación de 73 está por encima de la mediana general, pero pertenece a la mitad inferior dentro del grupo day. Ambas etiquetas son correctas porque responden a preguntas de comparación distintas.
Una media creciente entre los tramos de horas es una asociación. Los estudiantes de distintos tramos pueden diferir en otros aspectos, por lo que la tabla por sí sola no puede establecer que el tiempo adicional de estudio haya causado la diferencia de calificación. Los recuentos pequeños también hacen que una media sea más sensible a una sola observación.
Puntos clave
- Utiliza una Series de intervalos como clave de grupo para resumir otra variable.
- Indica los recuentos junto a las medias para que se vea la cantidad de datos que las respalda.
observed=Falseconserva los intervalos vacíos con recuentos de cero y medias faltantes.- Los cuantiles generales y los calculados dentro de cada grupo utilizan poblaciones de referencia distintas.
- Los patrones entre intervalos describen asociaciones y pueden ser sensibles a muestras pequeñas.
5Resume datos en tablas dinámicas y tablas de contingencia
Una tabla de doble entrada facilita la comparación de combinaciones de categorías. Una tabla dinámica resume un valor numérico en cada intersección de fila y columna, mientras que una tabla de contingencia suele contar observaciones. Los totales y las proporciones añaden contexto, pero su significado depende de la agregación y del denominador. Crearás ambas tablas y leerás cada celda como respuesta a una pregunta precisa.
5.1 Crea tablas dinámicas con pivot_table
Una tabla dinámica resume valores para combinaciones de claves de fila y columna. Cada celda reúne las observaciones de una intersección y aplica una función, como una suma o una media.
Asigna las funciones explícitamente
sales.pivot_table(
index="region", columns="product",
values="revenue", aggfunc="sum"
)
index proporciona las claves de fila, columns las claves de columna, values la variable medida y aggfunc el cálculo. La tabla es:
| Región | coffee | tea |
|---|---|---|
| East | 20 | 9 |
| North | 28 | 48 |
| South | 68 | 12 |
North–tea combina los ingresos 30 y 18, por lo que su suma es 48. South–coffee combina 36 y 32, lo que da 68. Los mismos datos pueden resumirse con sales.groupby(["region", "product"])["revenue"].sum().unstack().
La opción predeterminada de aggfunc es "mean". Omitirla daría North–tea 24 y South–coffee 34. Indica aggfunc="sum" cuando la pregunta pida totales; la estructura de una tabla no indica qué estadístico contiene.
Rellena con cuidado las combinaciones ausentes
Las combinaciones sin observaciones aparecen como NaN. Elimina el pedido de té de East y esa celda pasa a ser un valor faltante. fill_value=0 puede representar la ausencia de pedidos en un informe de sumas o recuentos. Para una media, sustituir una celda vacía por 0 sugiere una media observada que nunca se midió. Conserva su estado de valor faltante cuando no exista una media.
Las claves categóricas siguen la opción observed; desde pandas 3.0, la opción predeterminada muestra las categorías observadas. Establécela explícitamente cuando un informe deba conservar las categorías no utilizadas.
Añade resúmenes marginales con la misma función
sales.pivot_table(
index="region", columns="product", values="revenue",
aggfunc="sum", margins=True, margins_name="Total"
)
Los totales de fila son East 29, North 76 y South 80. Los totales de columna son coffee 116 y tea 69; el total general es 185. margins_name sustituye la etiqueta predeterminada All.
Los resúmenes marginales se vuelven a calcular a partir de las filas originales utilizando la función de agregación. Para una tabla dinámica de medias, la esquina es 23,125, la media de los ocho pedidos. Calcular la media de las medias de las seis celdas mostradas daría aproximadamente 21,17 porque las celdas contienen distintos números de observaciones. Un resumen marginal no es una instrucción general de sumar o promediar los números que aparezcan en pantalla.
Amplía la tabla o cuenta sus filas
aggfunc=["sum", "mean"] crea un bloque de columnas para cada estadístico. Con units, North–tea tiene suma 16 y media 8. Un diccionario de funciones como {"units": "sum", "revenue": "max"} asigna funciones a columnas de valores separadas. Varias claves también pueden crear filas o columnas jerárquicas, y los valores agrupados en intervalos funcionan como claves categóricas.
aggfunc="size" cuenta las filas por celda, mientras que "count" cuenta los valores presentes en la columna de valores elegida. North tiene un pedido de café y dos de té.
pivot no realiza ninguna agregación y requiere combinaciones únicas de fila y columna. La tabla de ventas tiene combinaciones repetidas de North–tea y South–coffee, por lo que pivot genera un error de entrada duplicada. Utiliza pivot_table cuando deban combinarse varias observaciones en una celda.
Puntos clave
index,columns,valuesyaggfuncdefinen el significado de cada celda de la tabla dinámica.- La agregación predeterminada es una media; solicita las sumas explícitamente.
- Rellena con cero los recuentos o totales ausentes solo cuando cero exprese correctamente la ausencia.
- Los resúmenes marginales aplican la misma función a las observaciones originales.
- Varias funciones o valores pueden producir columnas jerárquicas.
- Utiliza
pivot_tablepara combinaciones de claves repetidas ypivotpara combinaciones únicas.
5.2 Cuenta y compara categorías con crosstab
Una tabla de contingencia, o tabulación cruzada, cuenta observaciones para combinaciones de variables categóricas. Las proporciones permiten después comparar grupos que contienen distintos números de observaciones.
Cuenta combinaciones
Los datos de la encuesta tienen seis usuarios del plan básico: cuatro usan teléfonos y dos usan portátiles. Entre sus cuatro usuarios premium hay un usuario de teléfono y tres de portátil.
survey = pd.DataFrame({
"plan": ["basic"] * 6 + ["premium"] * 4,
"device": ["phone", "phone", "phone", "laptop", "phone", "laptop",
"laptop", "laptop", "phone", "laptop"],
"minutes": [20, 35, 15, 40, 25, 50, 60, 45, 30, 55]
})
counts = pd.crosstab(survey["plan"], survey["device"], margins=True)
Pasa las Series reales, no las cadenas "plan" y "device". La primera variable proporciona las filas y la segunda las columnas. La fila basic contiene laptop 2 y phone 4; la fila premium contiene laptop 3 y phone 1. Los totales de fila son 6 y 4, los totales de columna son 5 y 5, y el total general es 10.
Para los recuentos sin normalizar, una combinación ausente se muestra como cero. Se pueden obtener recuentos equivalentes con survey.groupby(["plan", "device"]).size().unstack(fill_value=0) o con una tabla dinámica que utilice aggfunc="size". survey.value_counts(["plan", "device"]) da una lista larga de frecuencias ordenada por recuento.
Elige el denominador según la pregunta
| Opción | Denominador | Significado de basic–phone |
|---|---|---|
normalize="all" | Todas las observaciones | 4/10 = 0,4 |
normalize="index" | Total de la fila basic | 4/6 ≈ 0,667 |
normalize="columns" | Total de la columna phone | 4/5 = 0,8 |
«¿Qué proporción de usuarios premium utiliza una portátil?» parte de los usuarios premium, por lo que el denominador es 4. Utiliza la normalización por filas; la respuesta es 3/4 = 0,75. «¿Qué proporción de usuarios de teléfono tiene el plan básico?» parte de los usuarios de teléfono, por lo que el denominador es 5. Utiliza la normalización por columnas; la respuesta es 4/5 = 0,8.
Un recuento de tres usuarios premium con portátil supera el recuento de dos del plan básico, pero la comparación dentro de cada plan es del 75 % frente a aproximadamente el 33,3 %. Identifica la población que se compara antes de convertir un recuento en una proporción. Multiplica los valores normalizados por 100 para obtener porcentajes.
Con margins=True, los resúmenes marginales normalizados también tienen significado. La normalización por filas añade una fila All que muestra las proporciones generales de dispositivos, 0,5 y 0,5. La normalización por columnas añade una columna All que muestra las proporciones generales de planes, 0,6 y 0,4.
Resume una tercera variable
Proporciona values y aggfunc para sustituir las frecuencias por un estadístico numérico:
pd.crosstab(survey["plan"], survey["device"],
values=survey["minutes"], aggfunc="mean")
Las sesiones con portátil del plan básico de 40 y 50 minutos tienen una media de 45. Las sesiones con teléfono del plan básico de 20, 35, 15 y 25 minutos tienen una media de 23,75. Las sesiones con portátil del plan premium de 60, 45 y 55 minutos tienen una media de aproximadamente 53,33, mientras que la única sesión con teléfono del plan premium dura 30 minutos. Estas celdas describen la duración de las sesiones, no los recuentos de usuarios.
Una lista de Series puede proporcionar varios niveles de fila o columna. Las calificaciones agrupadas en intervalos también funcionan como categorías: cruzar fail, pass, merit y distinction con el grupo de clase da recuentos para day de 1, 2, 2, 2 y para evening de 1, 2, 1, 1. El significado de cada celda sigue dependiendo de su clave de fila, su clave de columna y el estadístico elegido.
Puntos clave
crosstabcuenta las combinaciones de las Series o arreglos proporcionados.- Elige la normalización por fila, por columna o respecto al total general según la población que forme el denominador de la pregunta.
- Añadir
valuesyaggfunccambia las celdas de frecuencias a un resumen numérico.
Ejemplos de Agrupación y agregación con pandas
1Convierte filas en grupos útiles
12 pasos
- 1IntroducciónEmpieza con una pregunta por grupos
Un conjunto de pedidos puede responder a «¿Cuántas unidades se vendieron?» o «¿Cuántas unidades vendió cada región?». La segunda pregunta necesita una clave de agrupación.
Dividiremos los pedidos por región, seleccionaremos una columna de valores y combinaremos los resultados de cada grupo. Después cambiaremos las claves y la estructura de salida, teniendo en cuenta qué filas incluye el cálculo.
- 2EjemploPrepara cuatro pedidos
Utiliza una tabla pequeña para poder seguir cada fila:
orders = pd.DataFrame({ "region": ["West", "East", "West", "East"], "product": ["tea", "tea", "coffee", "tea"], "units": [6, 3, 8, 5] })Las dos filas de West están separadas por una fila de East. Aun así, pertenecen al mismo grupo cuando la clave es la región; la coincidencia de claves importa más que estar en posiciones vecinas.
- 3ExplicaciónDivide, suma y combina
orders.groupby("region")["units"].sum()East recibe las unidades 3 y 5, lo que da 8. West recibe 6 y 8, lo que da 14. pandas combina los dos totales en una Series indexada por región.
Llamar solo a
groupby("region")crea el objeto GroupBy. La selección ysum()especifican qué calcular a partir de esa agrupación. - 4ConsejoInspecciona antes de calcular
Guarda
g = orders.groupby("region")cuando sea útil realizar varias inspecciones.g.ngroupsindica 2,g.size()indica dos filas por región yg.get_group("West")muestra las observaciones de West.Seleccionar
g["units"]produce un SeriesGroupBy. Seleccionarg[["units"]]conserva la forma de DataFrame, aunque solo se seleccione una columna de valores. - 5DesafíoPredice un total modificado
Se añade a la tabla un nuevo pedido de West con 4 unidades. ¿Cuáles son los totales regionales y elimina la agrupación las filas de pedidos originales?
---reveal---
East se mantiene en 8. West pasa a 18 porque el nuevo pedido se suma a sus 14 unidades existentes. Las filas originales permanecen en la tabla de entrada; la suma agrupada es un nuevo objeto de resumen con una entrada por región.
- 6EjemploAñade una segunda clave
orders.groupby(["region", "product"])["units"].sum()Con los cuatro pedidos originales, East–tea suma 8, West–coffee suma 8 y West–tea suma 6. La Series tiene un índice de dos niveles.
unstack()mueve el producto a las columnas. East no tiene ninguna fila de café, por lo que su celda de café es un valor faltante; rellenarla con cero es adecuado para este informe de totales de unidades. - 7ConexiónUna clave puede calcularse
orders.groupby(orders["units"] >= 5)["units"].sum()La clave booleana crea un grupo
Falseque suma 3 y un grupoTrueque suma 19. Asigna una etiqueta a cada fila en lugar de filtrar los pedidos pequeños.Una Series a la que se ha aplicado una correspondencia también funciona como clave. Las claves Series se alinean por etiqueta de fila, mientras que un arreglo proporciona una etiqueta por posición y debe coincidir con el número de filas.
- 8DesafíoLee una clave del índice
Una Series de existencias tiene el índice M1, N1, M2 y los valores 4, 9, 7. ¿Qué devuelve
stock.groupby(lambda label: label[0]).sum()?---reveal---
M suma 11 y N suma 9. La función recibe cada etiqueta del índice y devuelve su primera letra. No inspecciona el valor de existencias. Un diccionario pasado directamente como clave también establece correspondencias con las etiquetas del índice; aplica primero una correspondencia a una columna cuando sus valores definan los grupos.
- 9ExplicaciónElige las etiquetas y el orden
orders.groupby("region", as_index=False)["units"].sum()devuelve una tabla con columnas de región y unidades.reset_index()convierte un resumen indexado en la misma estructura plana.La ordenación predeterminada de claves muestra East antes de West. Para ordenar los totales, ordena los valores calculados:
.sum().sort_values(ascending=False). El orden de las claves y el de los valores responden a necesidades distintas. - 10Idea claveLas claves faltantes y las no utilizadas son distintas
Supón que la región es categórica y también declara North, sin pedidos de North. Desde pandas 3.0, la opción predeterminada
observed=Trueomite esa categoría no utilizada;observed=Falsela muestra.Una fila sin región es un asunto distinto. La opción predeterminada
dropna=Truela excluye de los grupos.dropna=Falseconserva un grupo de claves faltantes. Una opción no puede sustituir a la otra. - 11DesafíoConcilia el informe
Los cuatro pedidos originales suman 22 unidades. Un quinto pedido tiene 7 unidades y ninguna región. Una columna categórica de región también declara una categoría North no utilizada. ¿Cómo puede un informe sumar 29 y mostrar North?
---reveal---
Agrupa con
dropna=False, observed=False. El grupo de claves faltantes conserva las 7 unidades adicionales; North aparece como categoría no utilizada con suma 0. Utiliza tambiénas_index=Falsesi el informe necesita columnas de claves normales. - 12RepasoComprueba claves, valores y forma
Elige la clave que expresa qué filas pertenecen al mismo grupo y después elige la operación y las columnas de valores seleccionadas. Inspecciona los grupos cuando no esté claro qué filas pertenecen a cada uno.
Después de calcular un total, comprueba si las claves faltantes causaron la exclusión de filas. Para la presentación, decide entre un resultado indexado y columnas de claves normales, y distingue entre ordenar los nombres de grupo y ordenar los valores calculados.
2Elige y nombra los resúmenes de grupo
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUn resumen debe responder a una pregunta
- 2EjemploExamina un lote con un valor faltante
- 3ExplicaciónInterpreta las opciones predeterminadas de reducción
- 4DesafíoCuenta las lecturas disponibles
- 5EjemploAsigna un nombre a cada salida
- 6ExplicaciónComprende las columnas con varias funciones
- 7DesafíoCorrige los nombres del informe
- 8EjemploAñade un rango personalizado
- 9ConsejoPrepara una columna booleana
- 10EjemploPondera la cantidad medida
- 11DesafíoCalcula el precio por unidad
- 12DesafíoCombina medias de grupos desiguales
- 13RepasoConserva el significado de cada estadístico
3Mantén el contexto del grupo en las filas correctas
16 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDecide qué filas necesita la respuesta
- 2EjemploDifunde un total
- 3EjemploConvierte totales en proporciones
- 4DesafíoElige el valor de relleno adecuado
- 5ExplicaciónEstablece primero la secuencia
- 6EjemploCompara con la observación anterior
- 7ConsejoElige la regla para los empates
- 8DesafíoSigue grupos intercalados
- 9EjemploConserva todas las filas de un grupo que cumple la condición
- 10ConsejoSelecciona filas o muestras dentro de los grupos
- 11DesafíoAplica una condición a todo el grupo
- 12ExplicaciónPredice la forma de apply
- 13EjemploDevuelve varias filas por grupo
- 14DesafíoCorrige una asignación a filas
- 15DesafíoCombina un total de grupo con una decisión por fila
- 16RepasoAdapta el método al resultado
4Crea y compara rangos numéricos
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónElige qué debe significar un tramo
- 2EjemploCrea intervalos fijos
- 3ExplicaciónIncluye los valores de los extremos
- 4ConsejoMantén las etiquetas en el orden de los intervalos
- 5DesafíoSitúa los valores de los límites
- 6ExplicaciónCalcula un cuantil muestral
- 7EjemploDivide por recuento o amplitud
- 8Idea claveLos empates pueden cambiar el número de intervalos
- 9DesafíoElige límites estables
- 10EjemploResume otra variable
- 11ConsejoMuestra los grupos vacíos con claridad
- 12DesafíoCambia la población de referencia
- 13DesafíoInterpreta la comparación final
- 14RepasoInterpreta los rangos antes de comparar resultados
5Interpreta totales y proporciones de doble entrada
11 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDa un significado a cada celda
- 2EjemploCrea una pequeña tabla dinámica
- 3ExplicaciónIndica la agregación
- 4Idea claveLos resúmenes marginales usan las observaciones originales
- 5DesafíoComunica ausencias y totales
- 6EjemploCuenta combinaciones de categorías
- 7ExplicaciónEmpieza por el denominador
- 8DesafíoCompara grupos desiguales
- 9ConexiónUna tabla de contingencia puede resumir valores
- 10DesafíoElige la tabla para un informe
- 11RepasoInterpreta juntas la función y la población
Ejercicios de Agrupación y agregación con pandas
Set 1: Interpreta grupos y elige resúmenes útiles10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
site y material. ¿Cómo agrupas por cada combinación de estas dos columnas?Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
site y mass_kg como columnas normales. ¿Qué llamada produce esa estructura?Mostrar respuestaOcultar respuesta
as_index=False conserva la clave de agrupación en una columna normal y devuelve un DataFrame plano. La opción predeterminada coloca las etiquetas de ubicación en el índice del resultado. sort=False cambia el orden de las claves de grupo, pero no las saca del índice.Pregunta 4 de 10
size() y su count() de lecturas?Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
peak y average a partir de load. ¿Qué agregación con nombres de salida es adecuada?Mostrar respuestaOcultar respuesta
peak y la carga media a average. Invertir el par pediría a pandas que buscara columnas de entrada con nombres de funciones en lugar de usar la columna de carga.Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
pd.cut(x, [0, 20, 40, 60]) con el cierre predeterminado?Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
pivot_table si se omite aggfunc?Mostrar respuestaOcultar respuesta
aggfunc="sum"; la estructura de la tabla dinámica no selecciona un total por sí sola.Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Set 2: Utiliza el contexto de las filas y compara distribuciones10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
g. ¿Qué expresión indica cuántos grupos contiene?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
lambda s: s.max() - s.min()?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
delay registrado es inferior a 4. ¿Qué predicado da una decisión por grupo?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
apply agrupado devuelve una Series con índices low y high para cada grupo. ¿Qué estructura crea pandas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
All para P y Q?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Comprueba las formas de los resultados y las decisiones sobre límites10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
["sum", "mean"]. ¿Qué etiquetas tienen las columnas del resultado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
pct_change() agrupado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
mass_kg de cada batch. ¿Qué procedimiento es adecuado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
f ordena cada grupo por calidad y devuelve dos filas. Con df.groupby("batch", group_keys=False).apply(f), ¿qué debes esperar antes de volver a asignar el resultado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
pd.cut(x, [0, 10, 20], right=False). ¿Cuáles de los valores 0, 10 y 20 reciben un intervalo?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
qcut(..., 4, duplicates="drop") en comparación con asignar rangos primero mediante method="first"?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Crea informes agrupados fiables10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
g = df.groupby("team")[["items"]]. ¿Qué objeto devuelve g.sum()?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
dropna=False, ¿qué sumas agrupadas se obtienen?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
std() agrupado predeterminado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
True, False para la planta A y True, True, False, False, False, False para la planta B. ¿Qué fracción de todos los artículos inspeccionados es defectuosa?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Diagnostica análisis agrupados y comparaciones10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
.agg("std") y .agg(np.std) pueden dar resultados distintos?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
apply agrupado de un DataFrame?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
apply(lambda s: s - s.mean()) en una Series numérica agrupada, después restablece el índice del resultado y asigna sus valores por posición a la tabla original sin ordenar. ¿Por qué puede ser incorrecta la nueva columna?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
len(s) sobre los valores 5, un valor faltante, 7. ¿Qué devuelve y qué mide ese número?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
fill_value=0 inducir a error a quien la lee?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Agregación (reducción)
Agregación con nombres de salida
total_mass a partir de una suma y max_temperature a partir de un máximo en un solo informe.Agregación personalizada
Agrupación en intervalos
Alineación por índices
Análisis por cuantiles
Análisis por intervalos
Aplicación de una función por grupos (apply)
Asociación
C
Categoría no utilizada
observed=False.Categorías observadas
Clave de agrupación
Clave faltante
dropna=False.Claves de grupo
apply puede añadirlas como nivel externo del índice.Columnas jerárquicas
Combinación de claves duplicada
pivot_table antes de ocupar una celda numérica.Correspondencia
Cuantil
Cuartil
qcut divida las observaciones en cuatro grupos con aproximadamente el mismo número de elementos.D
Desapilamiento
Desviación estándar muestral
Desviación respecto a la media del grupo
Diccionario de agregación
Difusión (broadcasting)
transform da a cada fila el denominador para calcular su propia proporción.Dividir, aplicar y combinar
E
Empate
Expresión lambda
F
Filtrado de grupos o filas
Filtro de grupos
Función aplicada a un grupo
apply agrupado puede proporcionarle varias columnas juntas.Función de agregación
G
Grados de libertad
Í
Índice jerárquico (MultiIndex)
I
Interpolación lineal
Intervalo cerrado por la derecha
cut excluyen el extremo izquierdo e incluyen el derecho.(20, 40] contiene un valor de 40, pero excluye un valor de 20.Intervalo definido por cuantiles
Intervalos de igual amplitud
L
Límite de clase
M
Media de valores booleanos
Media ponderada
Mediana
Muestra por grupos
n=1 incluye un registro de cada región no vacía en lugar de correr el riesgo de omitir regiones.N
Normalización
O
Objeto GroupBy
Objeto invocable (callable)
np.std puede utilizar un divisor predeterminado distinto del de la función de pandas indicada con la cadena "std".P
Población de referencia
Predicado
all() puede exigir que todas las lecturas de un grupo cumplan la misma condición de calidad.Proporción por columna
Proporción por fila
Proporción respecto al total general
Puntuación z dentro del grupo
R
Rango denso
Rango dentro del grupo
Recuento de filas
Recuento de valores distintos
nunique() de pandas excluye los valores faltantes de forma predeterminada.Recuento de valores presentes
Resultado escalar
apply agrupado combina en una Series indexada por claves de grupo.Resumen marginal
S
Selección de los n valores mayores
head(2) agrupado.Suma acumulada
T
Tabla de contingencia (tabulación cruzada)
Tabla dinámica
Tabla plana de resumen
Transformación
V
Valor de relleno
Valor rezagado
Variable categórica ordenada
Variación relativa
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.