HOWTO · Pandas

Cómo obtener y ordenar los valores únicos de una columna de un DataFrame

Este tutorial demuestra cómo encontrar valores únicos de una columna en Pandas DataFrame y cómo ordenarla

En esta página

Una columna de un DataFrame es una Series de Pandas. Llama a su función unique() para obtener los valores distintos en el orden en que aparecen por primera vez. Usa drop_duplicates() cuando necesites las filas correspondientes y sus demás columnas, o bien ordena los valores o las filas con sorted() de Python o con sort_values() de Pandas.

Los ejemplos usan un DataFrame pequeño con profesiones y departamentos. 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

df = pd.DataFrame({
    "profession": ["designer", "engineer", "designer", "analyst"],
    "department": ["product", "platform", "research", "finance"],
})

professions = df["profession"].unique()
print(professions)
print(type(professions).__name__)
<StringArray>
['designer', 'engineer', 'analyst']
Length: 3, dtype: str
StringArray

Obtener valores únicos de una columna de un DataFrame

Al seleccionar df["profession"] se obtiene una Series. Su función unique() devuelve un valor por cada profesión distinta, en el orden en que aparece por primera vez; no ordena los valores. El tipo concreto del resultado depende del dtype de la Series. En este ejemplo, los valores usan el dtype de extensión string de Pandas, por lo que el resultado es una StringArray, como muestra la salida. Otros dtypes pueden producir un array de NumPy u otro array de extensión. Adapta el nombre de la columna a tus datos. Si solo necesitas contar los valores distintos, usa len(df["profession"].unique()); en cambio, len(df) cuenta las filas, incluidas las que tienen profesiones repetidas. Convierte el resultado con .tolist() si el siguiente paso requiere específicamente una lista normal de Python.

Conservar una fila por cada valor único de la columna

Si necesitas conservar registros en lugar de obtener solo una colección de valores, llama a drop_duplicates(subset="profession") sobre el DataFrame. El resultado sigue siendo un DataFrame: cada fila conservada incluye su departamento y, de forma predeterminada, se mantiene la primera fila de cada profesión. En el resultado mostrado se elimina la segunda fila de diseñadora, mientras que se conserva la primera junto con su departamento de producto. Este método no elige una fila representativa según otro criterio; si quieres conservar un registro diferente, ordena o selecciona las filas de antemano. De forma predeterminada, el resultado conserva las etiquetas del índice original, por lo que puede haber saltos en el índice. Puedes pasar a subset una lista con varios nombres de columna cuando los registros duplicados se definan por una combinación de columnas.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

df = pd.DataFrame({
    "profession": ["designer", "engineer", "designer", "analyst"],
    "department": ["product", "platform", "research", "finance"],
})

unique_rows = df.drop_duplicates(subset="profession")
print(unique_rows.to_string(index=False))
print(type(unique_rows).__name__)
profession department
  designer    product
  engineer   platform
   analyst    finance
DataFrame

Ordenar valores únicos o filas de un DataFrame

La función integrada sorted() de Python devuelve una lista nueva con los valores en orden ascendente. Para ordenar los valores distintos, combínala con unique(); también puedes ordenar directamente la Series si quieres conservar los duplicados. Para ordenar en sentido descendente, pasa reverse=True a sorted().

Usa sort_values(by="profession") cuando quieras ordenar las filas y mantener juntas las demás columnas. Devuelve un DataFrame y, de forma predeterminada, ordena en sentido ascendente; para el orden descendente, establece ascending=False. Estos ejemplos muestran alternativas: ordenar los valores únicos produce una lista, mientras que ordenar las filas conserva los datos de cada fila. Puedes pasar una lista a by para ordenar por varias columnas, según su prioridad. Las listas mostradas contienen solo los valores de profesión, pero la salida final conserva todas las filas y sus departamentos, y ordena las profesiones desde ingeniero hasta analista. sort_values() conserva las etiquetas del índice original salvo que solicites ignore_index=True, que crea un índice secuencial nuevo para el resultado ordenado.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import pandas as pd

df = pd.DataFrame({
    "profession": ["designer", "engineer", "designer", "analyst"],
    "department": ["product", "platform", "research", "finance"],
})

print(sorted(df["profession"].unique()))
print(sorted(df["profession"].unique(), reverse=True))
print(df.sort_values(by="profession", ascending=False).to_string(index=False))
['analyst', 'designer', 'engineer']
['engineer', 'designer', 'analyst']
profession department
  engineer   platform
  designer    product
  designer   research
   analyst    finance