Función df.astype() de Pandas

Funciones comunes de Pandas


df.astype()Es una función de Pandas que se utiliza para convertir el tipo de datos de un DataFrame o Series.

Durante el procesamiento de datos, la incompatibilidad de tipos de datos es un problema común. Por ejemplo, números almacenados como cadenas, fechas almacenadas como texto, etc.astype()Permite convertir explícitamente los datos al tipo deseado, como entero, flotante, cadena, fecha, etc., para garantizar que los datos puedan calcularse y analizarse correctamente.


Sintaxis básica y parámetros

astype()Es tanto una función miembro de DataFrame como de Series, mediante el operador de punto.se invoca.

Formato de sintaxis

DataFrame.astype(dtype, copy=True, errors='raise')
Series.astype(dtype, copy=True, errors='raise')

Descripción de parámetros

Parámetro Tipo ¿Requerido? Descripción Valor predeterminado
dtype dtype de Python o dtype de NumPy Obligatorio Tipo de datos objetivo. Puede ser un tipo de Python (comoint、str), un tipo de NumPy (comonp.int64、np.float32) o un tipo de Pandas (como'int64'、'float64'、'category')。 Ninguno
copy bool Opcional Si esTrue, siempre devuelve un objeto nuevo; si esFalse, modifica el objeto original cuando sea posible. True
errors str Opcional Controla el manejo de errores.'raise'Indica que se lanza una excepción cuando la conversión falla;'ignore'indica que cuando la conversión falla se devuelven los datos originales, sin lanzar una excepción. 'raise'

Descripción del valor de retorno

  • Devuelve un nuevo DataFrame o Series, en el que los tipos de datos de todas las columnas especificadas se han convertido al tipo objetivo.

Ejemplos

A través de una serie de ejemplos, dominaremos a fondoastype()su uso.

Ejemplo 1: Convertir el tipo de datos de una sola columna

Convierte una columna de una Series o DataFrame al tipo especificado.

Ejemplo

import pandas as pd

# Crear un DataFrame, los valores se almacenan como cadenas
data = {
    'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu'],
    'Edad': ['25', '30', '35', '28'],  # almacenado como cadena
    'Salario': ['5000', '6000', '5500', '7000']  # almacenado como cadena
}
df = pd.DataFrame(data)

print(Tipo de datos original:)
print(df.dtypes)
print("=" * 50)

# Convertir la columna 'edad' a tipo entero
df['Edad'] = df['Edad'].astype(int)

print("Tipo de datos después de convertir la columna de edad:")
print(df.dtypes)
print("=" * 50)

# Convertir la columna 'salario' a tipo flotante
df['Salario'] = df['Salario'].astype(float)

print(Tipo de datos después de convertir la columna de salario:)
print(df.dtypes)
print("=" * 50)

print(Datos convertidos:)
print(df)

Resultado esperado:

原始数据类型:
姓名     object
年龄    object  # 字符串类型
薪资    object  # 字符串类型
==================================================
转换年龄列后的数据类型:
姓名      object
年龄     int64  # 整数类型
薪资    object
==================================================
转换薪资列后的数据类型:
姓名      object
年龄     int64
薪资    float64  # 浮点数类型
==================================================
转换后的数据:
    姓名  年龄    薪资
0  张三   25  5000.0
1  李四   30  6000.0
2  王五   35  5500.0
3  赵六   28  7000.0

Análisis del código:

  1. En los datos originales, la edad y el salario son de tipo cadena (object)。
  2. Usandodf['列名'].astype(int)convierte las cadenas a enteros.
  3. Después de la conversión se pueden realizar cálculos numéricos, como sumas, promedios, etc.

Ejemplo 2: Convertir el tipo de datos de todo el DataFrame

Se puede especificar el tipo de datos para todo el DataFrame de una sola vez.

Ejemplo

import pandas as pd

# Crear un DataFrame
data = {
    'A': [1, 2, 3, 4],
    'B': [1.5, 2.5, 3.5, 4.5],
    'C': ['a', 'b', 'c', 'd']
}
df = pd.DataFrame(data)

print(Tipo de datos original:)
print(df.dtypes)
print("=" * 50)

# Convertir la columna A a float64 y la columna B a int64
df_converted = df.astype({'A': 'float64', 'B': 'int64'})

print("Tipo de datos después de la conversión:")
print(df_converted.dtypes)
print("=" * 50)

print(Datos convertidos:)
print(df_converted)

Resultado esperado:

原始数据类型:
A      int64
B    float64
C     object
==================================================
转换后的数据类型:
A    float64
B      int64  # 小数部分被截断
C     object
==================================================
转换后的数据:
     A  B  C
0  1.0  2  a
1  2.0  2  b
2  3.0  3  c
3  4.0  4  d

Análisis del código:

  • Usando un diccionario{'nombre de columna': 'tipo'}se pueden especificar de una sola vez los tipos de conversión de varias columnas.
  • Al convertir los flotantes de la columna B a enteros, la parte decimal se trunca (2.5 se convierte en 2).

Ejemplo 3: Convertir a tipo de datos categórico

El tipo de datos categórico (category) puede ahorrar memoria y es especialmente adecuado para columnas con valores limitados.

Ejemplo

import pandas as pd

# Crear un DataFrame con muchos valores duplicados
data = {
    'Ciudad': ['Pekín', Shanghái, 'Guangzhou', 'Shenzhen', 'Pekín', Shanghái, 'Guangzhou', 'Shenzhen'] * 1000,
    'Número': range(8000)
}
df = pd.DataFrame(data)

print(Tipo de datos original:)
print(df.dtypes)
print(fUso de memoria: {df.memory_usage(deep=True).sum() / 1024:.2f} KB)
print("=" * 50)

# Convertir la columna '城市' a tipo categórico
df['Ciudad'] = df['Ciudad'].astype('category')

print("Tipo de datos después de la conversión:")
print(df.dtypes)
print(fUso de memoria: {df.memory_usage(deep=True).sum() / 1024:.2f} KB)

Resultado esperado:

原始数据类型:
城市    object
编号    int64
内存使用: ~456 KB
==================================================
转换后的数据类型:
城市    category
编号     int64
内存使用: ~120 KB  # 内存使用大幅减少

Análisis del código:

  • El tipo de datos categórico asigna un identificador entero a cada valor único, ahorrando mucha memoria en comparación con almacenar cadenas completas.
  • Los datos originales tienen 8000 filas y usan aproximadamente 456 KB; después de la conversión, alrededor de 120 KB, lo que ahorra aproximadamente un 75% de memoria.
  • Este método es especialmente adecuado para variables categóricas con pocos valores.

Ejemplo 4: Convertir a tipo de datos de fecha y hora

Convierte cadenas al tipo de fecha y hora para poder realizar operaciones relacionadas con fechas.

Ejemplo

import pandas as pd

# Crear un DataFrame con cadenas de fecha
data = {
    Fecha: ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
    Volumen de ventas: [100, 150, 120, 180]
}
df = pd.DataFrame(data)

print(Tipo de datos original:)
print(df.dtypes)
print("=" * 50)

# Convertir la columna 'fecha' a tipo fecha y hora
df[Fecha] = pd.to_datetime(df[Fecha])

print("Tipo de datos después de la conversión:")
print(df.dtypes)
print("=" * 50)

print(Datos convertidos:)
print(df)

# Ahora se pueden realizar operaciones relacionadas con la fecha
print(nExtraer el mes:)
print(df[Fecha].dt.month)

Resultado esperado:

原始数据类型:
日期    object  # 字符串类型
销量     int64
==================================================
转换后的数据类型:
日期    datetime64[ns]  # 日期时间类型
销量     int64
==================================================
转换后的数据:
        日期   销量
0 2024-01-01  100
1 2024-01-02  150
2 2024-01-03  120
3 2024-01-04  180

提取月份:
0    1
1    1
2    1
3    1
Name: 日期, dtype: int64

Análisis del código:

  • Usandopd.to_datetime()convierte la cadena al tipo de fecha y hora.
  • Después de la conversión, se puede usar.dtel accessor para realizar operaciones de fecha, como extraer el mes, el día de la semana, etc.
  • Nota: aunque también se puede usarastype('datetime64[ns]'), peropd.to_datetime()es más potente y flexible.

Ejemplo 5: Manejar errores de conversión

Usandoerrors='ignore'el parámetro permite manejar los casos en que la conversión falla.

Ejemplo

import pandas as pd

# Crear una Series con valores que no se pueden convertir a enteros
s = pd.Series(['1', '2', 'hello', '4', 'world'])

print("datos originales:")
print(s)
print("=" * 50)

# Intentar la conversión; con errors='raise' (predeterminado) se lanza una excepción
try:
    s_converted = s.astype(int)
except ValueError as e:
    print(f"Conversión fallida: {e}")
print("=" * 50)

# Usar errors='ignore'; si la conversión falla, se devuelven los datos originales
s_converted = s.astype(int, errors='ignore')

print("Datos convertidos con errors='ignore':")
print(s_converted)
print("=" * 50)

# Usar errors='coerce'; si la conversión falla, se rellena con NaN
s_converted2 = s.astype(float, errors='coerce')

print("Datos convertidos con errors='coerce':")
print(s_converted2)

Resultado esperado:

原始数据:
0       1
1       2
2    hello  # 无法转换为整数
3       4
4    world  # 无法转换为整数
==================================================
转换失败: invalid literal for int() with base 10: 'hello'
==================================================
使用 errors='ignore' 转换后的数据:
0       1
1       2
2    hello  # 保持原值
3       4
4    world  # 保持原值
==================================================
使用 errors='coerce' 转换后的数据:
0    1.0
1    2.0
2    NaN  # 无法转换,设为 NaN
3    4.0
4    NaN  # 无法转换,设为 NaN

Análisis del código:

  • Cuando una cadena contiene valores que no se pueden convertir a número, de forma predeterminada se lanzaValueErroruna excepción.
  • errors='ignore'Mantiene los datos originales sin cambios.
  • errors='coerce'Establece los valores no convertibles enNaN, que es un método común para tratar datos sucios.

Ejemplo 6: Convertir a tipo booleano

Convierte los datos a tipo booleano, usado a menudo para filtros condicionales y operaciones lógicas.

Ejemplo

import pandas as pd

# Crear un DataFrame que contiene 0 y 1
data = {
    'Es miembro': [0, 1, 1, 0, 1],
    'Está activo': ['Sí', 'No', 'Sí', 'Sí', 'No']
}
df = pd.DataFrame(data)

print("Datos originales:")
print(df)
print("Tipos de datos originales:")
print(df.dtypes)
print("=" * 50)

# Convertir 0/1 a tipo booleano
df['Es miembro'] = df['Es miembro'].astype(bool)

print("Tipos de datos después de convertir la columna 'Es miembro':")
print(df.dtypes)
print(df)
print("=" * 50)

# Convertir "Sí"/"No" a tipo booleano
df['Está activo'] = df['Está activo'].map({'Sí': True, 'No': False})

print("Datos después de convertir la columna 'Está activo':")
print(df)
print(df.dtypes)

Resultado esperado de la ejecución:

原始数据:
  是否会员  是否激活
0       0       是
1       1       否
2       1       是
3       0       是
4       1       否
==================================================
转换是否会员列后的数据类型:
是否会员      bool
是否激活    object
==================================================
转换是否激活列后的数据:
  是否会员  是否激活
0    True    True
1   True   False
2    True    True
3   False   True
4    True   False

Análisis del código:

  • 0 se puede convertir aFalse, 1 se convierte aTrue。
  • Para cadenas como "Sí"/"No", es necesario usarmap()para convertir.
  • Después de la conversión, se puede utilizar la indexación booleana para filtrar rápidamente.

Precauciones

  • astype()De forma predeterminada, se devuelve un nuevo objeto y no se modifican los datos originales. Si desea modificar en el lugar, puede usarcopy=Falseel parámetro, pero puede afectar a los datos originales.
  • Al convertir números de punto flotante a enteros, la parte decimal se trunca, no se redondea.
  • Al convertir cadenas a números, asegúrese de que la cadena tenga un formato numérico válido; de lo contrario, se lanzará una excepción.
  • Usarerrors='coerce'es el método recomendado para manejar datos sucios, puede convertir valores no válidos aNaN, y luego usarfillna()para rellenar.
  • Para columnas con muchos valores repetidos, convertirlas al tipo categórico puede reducir significativamente el uso de memoria.

Funciones comunes de Pandas

Otras extensiones