Función df.astype() 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
# 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:
- En los datos originales, la edad y el salario son de tipo cadena (
object)。 - Usando
df['列名'].astype(int)convierte las cadenas a enteros. - 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
# 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
# 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
# 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:
- Usando
pd.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 usar
astype('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
# 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 lanza
ValueErroruna 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
# 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 a
False, 1 se convierte aTrue。 - Para cadenas como "Sí"/"No", es necesario usar
map()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.
- Usar
errors='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.
Otras extensiones