HOWTO · Pandas
Contar valores únicos por grupos en los pandas
contar los valores agrupando la columna en DataFrame usando los métodos df.groupby().nunique(), df.groupby().agg(), y df.groupby().unique() en la biblioteca de pandas
En esta página
Al analizar un DataFrame, a menudo necesitas saber cuántos valores distintos aparecen dentro de cada grupo y no en toda la columna. Por ejemplo, un conjunto de datos podría registrar qué valores de code usa cada entrada de Countries, y quieres un recuento por país. La operación groupby() de pandas ofrece tres herramientas prácticas para esta tarea:
df.groupby().nunique()devuelve el número de valores distintos en cada grupo.df.groupby().agg()aplica el mismo recuento a través de la interfaz general de agregación.df.groupby().unique()enumera los propios valores distintos de cada grupo.
Todos los ejemplos siguientes usan el mismo DataFrame, construido a partir de nueve filas de pares de país y código.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
data = [
[999, "Switzerland"],
[113, "Switzerland"],
[112, "Japan"],
[112, "Switzerland"],
[113, "Canada"],
[114, "Japan"],
[100, "Germany"],
[114, "Japan"],
[115, "Germany"],
]
df = pd.DataFrame(data, columns=["code", "Countries"])
print(df)
code Countries
0 999 Switzerland
1 113 Switzerland
2 112 Japan
3 112 Switzerland
4 113 Canada
5 114 Japan
6 100 Germany
7 114 Japan
8 115 Germany
Contar valores únicos con GroupBy.nunique()
La forma más directa de contar valores distintos por grupo es nunique(). Al seleccionar la columna code después de groupby(), el objeto agrupado se convierte en una Series agrupada, de modo que nunique() cuenta los distintos códigos dentro de las filas de cada país.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
data = [
[999, "Switzerland"],
[113, "Switzerland"],
[112, "Japan"],
[112, "Switzerland"],
[113, "Canada"],
[114, "Japan"],
[100, "Germany"],
[114, "Japan"],
[115, "Germany"],
]
df = pd.DataFrame(data, columns=["code", "Countries"])
result = df.groupby("Countries")["code"].nunique()
print(result)
Countries
Canada 1
Germany 2
Japan 2
Switzerland 3
Name: code, dtype: int64
El resultado es una Series cuyo índice contiene los nombres de los grupos y cuyos valores contienen los recuentos: Suiza usa tres códigos distintos, Alemania y Japón usan dos cada uno, y Canadá usa uno. Como las claves de grupo se convirtieron en el índice, llama a reset_index() si quieres un DataFrame plano de dos columnas, o usa la forma agg() de la siguiente sección. Por defecto, nunique() no cuenta las entradas faltantes (NaN); pasa dropna=False si los valores faltantes deben contarse como un valor distinto.
Contar valores únicos con GroupBy.agg()
agg() es el método de agregación general de un objeto agrupado. Pasar nunique() como función de agregación produce los mismos recuentos a través de la interfaz DataFrame.aggregate(), con más control sobre la forma del resultado.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
data = [
[999, "Switzerland"],
[113, "Switzerland"],
[112, "Japan"],
[112, "Switzerland"],
[113, "Canada"],
[114, "Japan"],
[100, "Germany"],
[114, "Japan"],
[115, "Germany"],
]
df = pd.DataFrame(data, columns=["code", "Countries"])
result = df.groupby(by="Countries", as_index=False).agg({"code": pd.Series.nunique})
print(result)
Countries code
0 Canada 1
1 Germany 2
2 Japan 2
3 Switzerland 3
El diccionario {"code": pd.Series.nunique} indica a agg() qué columna agregar y qué función aplicar; pd.Series.nunique es la misma operación llamada directamente en la sección anterior, y pasar su nombre como cadena — agg({"code": "nunique"}) — funciona de forma idéntica. El argumento as_index=False mantiene los nombres de los países como una columna normal en lugar de moverlos al índice, por eso result es un DataFrame plano en lugar de una Series indexada. Recurre a esta forma cuando quieras un DataFrame como resultado o cuando el recuento de distintos sea una de varias agregaciones calculadas en una sola pasada.
Enumerar valores únicos con GroupBy["code"].unique()
Un recuento responde «cuántos», pero a veces necesitas saber qué códigos usa cada país. Aplicar unique() a una Series agrupada devuelve los propios valores distintos.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pandas as pd
data = [
[999, "Switzerland"],
[113, "Switzerland"],
[112, "Japan"],
[112, "Switzerland"],
[113, "Canada"],
[114, "Japan"],
[100, "Germany"],
[114, "Japan"],
[115, "Germany"],
]
df = pd.DataFrame(data, columns=["code", "Countries"])
result = df.groupby("Countries")["code"].unique()
print(result)
Countries
Canada [113]
Germany [100, 115]
Japan [112, 114]
Switzerland [999, 113, 112]
Name: code, dtype: object
Cada entrada del resultado es un array con los valores code distintos observados para ese país, en orden de aparición — el array de Suiza confirma los tres códigos contados antes: 999, 113 y 112. Como cada elemento es un array y no un número único, la Series tiene dtype object. Una diferencia de comportamiento que conviene señalar: unique() incluye un NaN en el array devuelto, mientras que nunique() omite los valores faltantes por defecto.
Elegir entre contar y enumerar valores
Elige nunique() cuando la pregunta sea cuantitativa — «¿cuántos códigos distintos usa cada país?» Devuelve recuentos numéricos bien organizados que puedes ordenar, filtrar o unir de nuevo a las filas originales. Para adjuntar el recuento de grupo de cada fila como una columna nueva, usa df.groupby("Countries")["code"].transform("nunique"), que difunde el recuento por grupo a cada fila.
Elige unique() cuando importe la identidad de los valores — por ejemplo, para auditar qué códigos se comparten entre países o para pasar las listas de valores a un paso de procesamiento posterior. Si ya tienes el resultado de unique() y necesitas sus longitudes, result.apply(len) reproduce los mismos recuentos que daría nunique().
Por último, usa agg() cuando un recuento de distintos sea solo una parte de una agregación más amplia, como agg({"code": "nunique", "price": "sum"}), que calcula varias estadísticas por grupo en una sola pasada. En resumen: nunique() para el recuento, unique() para los valores, y agg() cuando necesites un DataFrame como resultado o quieras combinar el recuento con otras agregaciones.