)}"

Pandas 常用函数Funciones comunes de Pandas


pd.factorize()Es una función de la biblioteca Pandas utilizada paracodificar variables categóricasLa función convierte datos categóricos en codificación entera y devuelve una lista de valores únicos.

Esta es una técnica común en el preprocesamiento de aprendizaje automático, que convierte las categorías de texto en valores numéricos para facilitar el procesamiento de los algoritmos. En comparación con la codificación one-hot (pd.get_dummies()), la codificación por factorización no aumenta la dimensión de los datos.

Significado de la palabra: factorizeSignifica "factorización"; aquí se refiere a convertir variables categóricas en factores numéricos (codificación entera).


Sintaxis básica y parámetros

pd.factorize()Es una función de nivel superior de la biblioteca Pandas, utilizada para codificar variables categóricas como enteros.

Formato de sintaxis

pd.factorize(values, sort=False, na_sentinel=-1, size_hint=None)

Descripción de parámetros

  • Parámetro: values
    • Tipo: objeto array-like, como Series, listas, arreglos, etc.
    • Descripción: los datos categóricos que se van a codificar.
  • Parámetro: sort
    • Tipo: valor booleano.
    • Si esTrue, ordena los valores únicos antes de codificar. El valor predeterminado esFalse(codifica en orden de aparición).
  • Parámetro: na_sentinel
    • Tipo: entero.
    • Entero utilizado para marcar valores faltantes. El valor predeterminado es-1. Si se establece enNone, los valores faltantes se mantienen como NaN.
  • Descripción de la función

    • Valor de retorno: Devuelve una tupla (codes, uniques), donde codes es el arreglo de enteros codificados y uniques es el arreglo de valores únicos.
    • Efecto: Mapea las variables categóricas a una secuencia de enteros que comienza en 0; cada valor único corresponde a un entero.

    Ejemplos

    Vamos a dominar completamente, mediante una serie de ejemplos de simples a complejos,pd.factorize()su uso.

    Ejemplo 1: Uso básico - Codificación de variables categóricas

    Ejemplo

    import pandas as pd
    import numpy as np

    # 1. Crear datos categóricos
    colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])

    print(=== Datos categóricos originales ===)
    print(colors)

    # 2. Uso de pd.factorize() para codificar
    codes, uniques = pd.factorize(colors)

    print("\n=== Resultado de codificación de pd.factorize() ===")
    print(f"Código: {codes}")  # Entero codificado
    print(fValores únicos: {uniques})  Lista de valores únicos
    print(f"Tipo: {type(codes)}")

    Resultado esperado:

    === 原始分类数据 ===
    0       red
    1      blue
    2     green
    3       red
    4      blue
    5     yellow
    原始数据中 'red' 出现 2 次,'blue' 出现 2 次,'green' 和 'yellow' 各出现 1 次。
    
    按出现顺序分配编码:
    - 'red' -> 0
    - 'blue' -> 1
    - 'green' -> 2
    - 'yellow' -> 3
    === 编码: [0 1 2 0 1 3]
    === 唯一值数组: ['red' 'blue' 'green' 'yellow']
    

    Análisis del código:

    1. El codes devuelto es un arreglo de enteros; cada valor original se reemplaza por el código entero correspondiente.
    2. El arreglo uniques almacena todos los valores únicos, ordenados según el orden de codificación correspondiente.
    3. Por defecto, asigna códigos en orden de aparición (el primer valor que aparece se codifica como 0).

    Ejemplo 2: Parámetro sort - Codificación después de ordenar los valores únicos

    Usandosort=Truese pueden ordenar los valores únicos antes de codificar, lo que facilita la previsibilidad de los resultados.

    Ejemplo

    import pandas as pd
    import numpy as np

    # Crear datos categóricos
    colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow'])

    print("=== Datos originales ===")
    print(colors)

    # 1. Sin ordenar (por defecto) - codificar según el orden de aparición
    codes_unsorted, uniques_unsorted = pd.factorize(colors, sort=False)
    print("\n=== sort=False (predeterminado) ===)
    print(f"Códigos: {codes_unsorted}")
    print(fValores únicos: {uniques_unsorted})

    # 2. Codificación después de ordenar - en orden alfabético
    codes_sorted, uniques_sorted = pd.factorize(colors, sort=True)
    print("\n=== sort=True (orden alfabético) ===)
    print(fCódigos: {codes_sorted})
    print(f"Valores únicos: {uniques_sorted}")

    # 3. Ordenar valores numéricos
    numbers = pd.Series([5, 2, 8, 5, 3, 2, 9])
    codes_num, uniques_num = pd.factorize(numbers, sort=True)
    print("\n=== Código de ordenamiento numérico ===)
    print(fCódigos: {codes_num})
    print(fValores únicos: {uniques_num})

    Resultado esperado:

    === 原始数据 ===
    0       red
    1      blue
    2      green
    3       red
    4      blue
    5      yellow
    
    === sort=False (默认) ===
    编码: [0 1 2 0 1 3]
    唯一值: ['red' 'blue' 'green' 'yellow']
    
    === sort=True (按字母顺序) ===
    编码: [2 0 1 2 0 3]
    唯一值: ['blue' 'green', 'red', 'yellow']
    按字母顺序排列:blue, green, red, yellow
    - blue -> 0
    - green -> 1
    - red -> 2
    - yellow -> 3
    
    === 数值排序编码 ===
    编码: [2 0 3 2 1 0 4]
    唯一值: [2, 3, 5, 8, 9]
    按数值排序:2, 3, 5, 8, 9
    - 2 -> 0
    - 3 -> 1
    - 5 -> 2
    - 8 -> 3
    - 9 -> 4
    

    Análisis del código:

    • sort=TrueAl ordenar los valores únicos y luego codificar, el orden de codificación es determinista y predecible.
    • Esto es útil cuando se necesitan resultados reproducibles.

    Ejemplo 3: Manejo de valores faltantes

    na_sentinelEl parámetro se usa para controlar el manejo de los valores faltantes.

    Ejemplo

    import pandas as pd
    import numpy as np

    # 1. Datos con valores faltantes
    data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', 'b'])

    print(=== Datos con valores faltantes ===)
    print(data)

    # 2. Comportamiento por defecto (valores faltantes → -1)
    codes_default, uniques_default = pd.factorize(data)
    print("\n=== Manejo por defecto (valor faltante = -1) ===)
    print(f"Codificación: {codes_default}")
    print(f"Valores únicos: {uniques_default}")

    # 3. Codificación personalizada de valores faltantes (simulando na_sentinel=-999)
    codes_custom = np.where(codes_default == -1, -999, codes_default)
    print("\n=== Codificación personalizada de valores faltantes (-999) ===)
    print(fCódigos: {codes_custom})

    # 4. Mantener NaN (simulando na_sentinel=None)
    codes_nan = codes_default.astype('float')
    codes_nan[codes_nan == -1] = np.nan

    print("\n=== Mantener NaN ===)
    print(fCódigos: {codes_nan})
    print(f"Tipo de código: {type(codes_nan")

    Resultado esperado:

    === 包含缺失值的数据 ===
    0       a
    1       b
    2     NaN
    3       a
    4    None
    5       c
    6       b
    dtype: object
    
    === 默认处理(缺失值 = -1)===
    编码: [ 0  1 -1  0 -1  2  1]
    唯一值: Index(['a', 'b', 'c'], dtype='object')
    
    === 自定义缺失值编码(-999)===
    编码: [   0    1 -999    0 -999    2    1]
    
    === 保持 NaN ===
    编码: [ 0.  1. nan  0. nan  2.  1.]
    编码类型: <class 'numpy.float64'>

    Ejemplo 4: Aplicación en aprendizaje automático

    La codificación por factorización es muy útil en el preprocesamiento de aprendizaje automático, especialmente para variables categóricas de alta cardinalidad.

    Ejemplo

    import pandas as pd

    # 1. Crear un DataFrame que contenga variables categóricas
    df = pd.DataFrame({
        'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank'],
        'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai', 'Beijing'],
        'department': ['Sales', 'Engineering', 'Sales', 'HR', 'Engineering', 'Sales']
    })

    print(=== DataFrame original ===)
    print(df)

    # 2. Codificación de factores para columnas categóricas
    # Crear un diccionario de mapeo
    city_codes, city_uniques = pd.factorize(df['city'])
    dept_codes, dept_uniques = pd.factorize(df['department'])

    print("\n=== Resultado de codificación factorizada ===)
    print(fcódigos de city: {city_codes.tolist()})
    print(fvalores únicos de city: {city_uniques})
    print(f"department código: {dept_codes.tolist()}")
    print(fvalores únicos de department: {dept_uniques})

    # 3. Crear el DataFrame codificado
    df_encoded = df.copy()
    df_encoded['city_encoded'] = city_codes
    df_encoded['dept_encoded'] = dept_codes

    print("\n=== DataFrame codificado ===)
    print(df_encoded)

    # 4. Codificación de nuevos datos usando un diccionario de mapeo
    print("\n=== Diccionario de mapeo ===)
    city_mapping = dict(zip(city_uniques, range(len(city_uniques))))
    print(fmapeo de city: {city_mapping})

    # Codificar los nuevos datos
    new_cities = pd.Series(['Beijing', 'Shanghai', 'Shenzhen'])
    new_codes = new_cities.map(city_mapping)
    print(f"\nCodificación de nuevos datos: {new_codes.tolist()}")

    Resultado esperado:

    === 原始 DataFrame ===
        name       city department
    0  Alice    Beijing      Sales
    1    Bob   Shanghai  Engineering
    2  Charlie    Beijing      Sales
    3  Diana  Guangzhou        HR
    4   eve  Shanghai  Engineering
    5   Frank    Beijing      Sales
    
    === 因子化编码结果 ===
    city 编码: [0 1 0 2 1 0]
    city 唯一值: ['Beijing' 'Shanghai' 'Guangzhou']
    department 编码: [0 1 0 2 1 0]
    department 唯一值: ['Sales' 'Engineering' 'HR']
    
    === 编码后的 DataFrame ===
        name       city department  city_encoded  dept_encoded
    0  Alice    Beijing      Sales             0            0
    1    Bob   Shanghai  Engineering           1            1
    2  Charlie    Beijing      Sales            0            0
    3  Diana  Guangzhou        HR               2            2
    4    Eve   Shanghai  Engineering           1            1
    5   Frank    Beijing  Sales               0            0
    
    === 映射字典 ===
    city 映射: {'Beijing': 0, 'Shanghai': 1, 'Guangzhou': 2}
    

    Análisis del código:

    • pd.factorize()Devuelve una tupla, que se puede desempaquetar directamente para obtener los códigos y los valores únicos.
    • Después de crear el diccionario de mapeo, se puede aplicar la misma codificación a los nuevos datos, lo que facilita la inferencia del modelo de aprendizaje automático.
    • La codificación por factorización no aumenta la dimensión de los datos, por lo que es adecuada para manejar variables categóricas de alta cardinalidad.

    Consejo: pd.factorize()Es adecuada para variables categóricas ordenadas o no ordenadas. Si se necesita codificación one-hot (para algoritmos como regresión logística), utilicepd.get_dummies()la función.

    Pandas 常用函数Funciones comunes de Pandas

    Otras extensiones