Función pd.to-numeric() de Pandas
pd.to_numeric()Se utiliza en la biblioteca Pandas paraconvertir datos a tipos numéricosde la función. Puede convertir datos de varios formatos (como cadenas, columnas de tipos mixtos) a tipos numéricos como enteros, flotantes, etc.
Es una función común en la limpieza de datos, especialmente al procesar datos importados de archivos o bases de datos, donde a menudo es necesario convertir columnas que parecen numéricas pero en realidad son cadenas.
Significado de la palabra: to_numericSignifica "convertir a numérico", es decir, convertir datos de otros tipos a tipos numéricos.
Sintaxis básica y parámetros
pd.to_numeric()Es una función de nivel superior de la biblioteca Pandas, utilizada para convertir entradas a tipos numéricos.
Formato de sintaxis
pd.to_numeric(arg, errors='raise', downcast=None)
Descripción de parámetros
- Parámetro:
arg- Tipo: Series, lista, array u objeto similar a un diccionario.
- Descripción: Los datos a convertir a tipos numéricos. Generalmente es una Series.
- Parámetro:
errors- Tipo: cadena ('raise', 'coerce', 'ignore').
- Descripción: forma de manejo de errores.
'raise'(Predeterminado) Lanza una excepción cuando encuentra un valor que no se puede convertir.'coerce'Establece los valores no convertibles como NaN.'ignore'Ignora errores y devuelve los datos originales.
- Parámetro:
downcast- Tipo: cadena ('integer', 'signed', 'unsigned', 'float') o None.
Descripción de la función
- Valor de retorno: Devuelve una Series de tipo numérico.
- Efecto: Convierte el tipo de los datos de entrada a numérico (int64 o float64).
Ejemplos
A través de una serie de ejemplos, de simples a complejos, dominaremos completamentepd.to_numeric()su uso.
Ejemplo 1: Uso básico: convertir cadenas a valores numéricos
Ejemplos
# 1. Crear una Series que contenga cadenas numéricas
s = pd.Series(['10', '20', '30', '40', '50'])
print("=== Series original (tipo: ", s.dtype, ")===")
print(s)
# 2. Usar pd.to_numeric() para convertir a tipos numéricos
result = pd.to_numeric(s)
print("\n=== Después de pd.to_numeric() (tipo: ", result.dtype, ")===")
print(result)
Resultado esperado:
=== 原始 Series(类型: object )=== 0 10 1 20 2 30 3 40 5 50 dtype: object === pd.to_numeric() 转换后(类型: int64 )=== 0 10 1 20 2 30 3 40 4 50 dtype: int64
Análisis del código:
- Los datos originales son de tipo cadena (object), no se pueden realizar operaciones numéricas.
pd.to_numeric()Al convertirlos al tipo entero (int64), se pueden realizar operaciones matemáticas.
Ejemplo 2: Manejo de cadenas que contienen valores no numéricos
Usando elerrorsparámetro se pueden manejar de forma flexible los valores que no se pueden convertir.
Ejemplos
import numpy as np
# 1. Crear una Series que contenga cadenas no numéricas
s = pd.Series(['10', '20', 'abc', '40', 'ejemplo'])
print("=== Series con valores no numéricos ===")
print(s)
# 2. errors='raise' (predeterminado): lanza una excepción cuando encuentra un valor no convertible
print("\n=== errors='raise' (predeterminado) ===)
try:
result = pd.to_numeric(s, errors='raise')
except Exception as e:
print(f"Excepción: {e}")
# 3. errors='coerce': establece los valores no convertibles como NaN
print("\n=== errors='coerce' ===")
result_coerce = pd.to_numeric(s, errors='coerce')
print(result_coerce)
# 4. errors='ignore': ignora errores y devuelve los datos originales
print("\n=== errors='ignore' ===")
result_ignore = pd.to_numeric(s, errors='ignore')
print(result_ignore)
print(f"Tipo: {result_ignore.dtype}")
Resultado esperado:
=== 包含非数值的 Series === 0 10 1 20 2 abc 3 40 4 ejemplo 包含了 'abc', 'ejemplo' 等无法转换的字符串 === errors='raise'(默认)=== 异常: Unable to convert string to float explicitly === errors='coerce' === 0 10.0 1 20.0 2 NaN 3 40.0 4 NaN dtype: float64 === errors='ignore' === 0 10 1 20 2 abc 3 40 4 ejemplo Tipo: object
Análisis del código:
errors='coerce'Es muy práctico, reemplaza los valores no convertibles con NaN (valores faltantes) y conserva los valores convertibles.errors='ignore'Mantiene los datos originales sin cambios, adecuado para situaciones donde solo se quiere intentar la conversión sin modificar los datos.
Ejemplo 3: Manejo de valores numéricos mixtos y valores faltantes
En datos reales, a menudo es necesario manejar columnas que contienen valores faltantes mezclados con valores numéricos.
Ejemplos
import numpy as np
# 1. Crear una Series que contenga valores faltantes y cadenas numéricas
s = pd.Series(['100', '200', None, 'N/A', '400', '', '500'])
print("=== Series con valores faltantes y no numéricos ===")
print(s)
# 2. Convertir usando errors='coerce'
print("\n=== Conversión usando errors='coerce' ===)
result = pd.to_numeric(s, errors='coerce')
print(result)
# 3. Ver qué valores se convirtieron a NaN
print("\n=== Identificar valores NaN ===)
print(f"Posiciones NaN: {result.isna().tolist()}")
# 4. Rellenar los NaN con 0 o eliminarlos
print("\n=== Rellenar NaN con 0 ===)
print(result.fillna(0))
Resultado esperado:
=== 包含缺失值和数值字符串的 Series === 0 100 1 200 2 None 3 N/A 4 400 5 (空字符串) 6 字符串 '500' dtype: object === 使用 errors='coerce' 转换 === 0 100.0 1 200.0 даль 2 NaN 3. NaN 4 400.0 5 NaN 6 NaN dtype: float64
Análisis del código:
errors='coerce'Puede manejar None, cadenas vacías, N/A y otras formas de representar valores faltantes, convirtiéndolos uniformemente a NaN.- El tipo después de la conversión se vuelve float64 (porque es necesario representar NaN).
Ejemplo 4: Uso del parámetro downcast para optimizar la memoria
Para conjuntos de datos grandes, se puede usar eldowncastparámetro downcast para reducir el uso de memoria.
Ejemplos
import numpy as np
# 1. Crear una Series de enteros grandes
s = pd.Series([1, 2, 3, 4, 5] * 100000)
print("=== Tipo original:", s.dtype)
print("=== Memoria original:", s.memory_usage(deep=True), "bytes")
# 2. Convertir a numérico sin especificar downcast
result_default = pd.to_numeric(s)
print("\n=== Tipo después de la conversión predeterminada:", result_default.dtype)
print("=== Memoria predeterminada:", result_default.memory_usage(deep=True), "bytes")
# 3. Convertir hacia abajo a un tipo entero más pequeño
result_signed = pd.to_numeric(s, downcast='signed')
print("\n=== Tipo con downcast='signed':", result_signed.dtype)
print("=== Memoria con downcast='signed':", result_signed.memory_usage(deep=True), "bytes")
# 4. Convertir hacia abajo a un tipo flotante
float_data = pd.Series([1.5, 2.5, 3.5] * 100000)
result_float = pd.to_numeric(float_data, downcast='float')
print("\n=== Tipo con downcast='float':", result_float.dtype)
print("=== Memoria con downcast='float':", result_float.memory_usage(deep=True), "bytes")
Resultado esperado:
=== 原始类型: int64 === 原始内存: 2800000 bytes === 默认转换后类型: int64 内存节省:2.8 MB -> 1.4 MB === downcast='signed' 类型: int8/int16/int32 内存节省约 50% === downcast='float' 类型: float32 内存节省约 50%
Análisis del código:
- Para conjuntos de datos grandes,
downcastpuede reducir significativamente el uso de memoria. downcast='signed'Intenta convertir enteros al tipo entero con signo más pequeño.downcast='float'Convierte flotantes de float64 a float32.
Otras extensionesConsejo:Al procesar datos a gran escala,
pd.to_numeric()combinando elerrors='coerce'ydowncastparámetro downcast se puede convertir eficientemente datos mixtos a tipos numéricos y optimizar la memoria.
Funciones comunes de Pandas