Change column type in pandas

tiene cuatro opciones principales para convertir tipos en pandas:

siga leyendo para obtener explicaciones más detalladas y el uso de cada uno de estos métodos.

la mejor manera de convertir una o más columnas de un DataFrame a valores numéricos es usar pandas.to_numeric().

esta función intentará cambiar objetos no numéricos (como cadenas) en números enteros o números de coma flotante según corresponda.

uso básico

la entrada a to_numeric() es una serie o una sola columna de un DataFrame.,

como puede ver, se devuelve una nueva serie. Recuerde asignar esta salida a un nombre de variable o columna para continuar usándola:

# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)

También puede usarla para convertir múltiples columnas de un DataFrame a través del método apply():

siempre que sus valores se puedan convertir, probablemente eso sea todo lo que necesita.

manejo de errores

pero ¿qué pasa si algunos valores no se pueden convertir a un tipo numérico?,

to_numeric() también toma un argumento de palabra clave errors que le permite forzar que los valores no numéricos sean NaN, o simplemente ignorar las columnas que contienen estos valores.

Aquí hay un ejemplo usando una serie de cadenas s que tiene el objeto dtype:

>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object

el comportamiento predeterminado es elevar si no puede convertir un valor., En este caso, no puede hacer frente a la cadena ‘pandas’:

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string

en lugar de fallar, es posible que deseemos que ‘pandas’ se considere un valor numérico faltante/incorrecto., Podemos coaccionar valores no válidos a NaN de la siguiente manera usando el argumento de palabra clave errors:

>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64

la tercera opción para errors es simplemente ignorar la operación si un valor no válido es encontrado:

>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched

esta última opción es particularmente útil cuando desea convertir su DataFrame completo, pero no desconoce cuál de nuestras columnas se puede convertir de manera confiable a un tipo numérico., En ese caso, simplemente escriba:

df.apply(pd.to_numeric, errors='ignore')

La función se aplicará a cada columna del DataFrame. Las columnas que se pueden convertir a un tipo numérico se convertirán, mientras que las columnas que no pueden (por ejemplo, contienen cadenas o fechas que no son dígitos) se dejarán solas.

Downcasting

de forma predeterminada, la conversión con to_numeric()le dará un int64o float64 dtype (o cualquier ancho entero nativo de su plataforma).,

eso es normalmente lo que quieres, pero ¿qué pasa si quieres ahorrar algo de memoria y usar un dtype más compacto, como float32, o int8?

>>> s = pd.Series()>>> s0 11 22 -7dtype: int64

Downcasting to ‘integer’ usa el entero más pequeño posible que puede contener los valores:

>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8

Downcasting to ‘float’ similarly picks a smaller than normal floating type:

>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32

astype()

el método astype() le permite ser explícito sobre el dtype que desea que tenga su dataframe o serie., Es muy versátil, ya que puedes intentar ir de un tipo a otro.

uso básico

llame al método en el objeto que desea convertir y astype() intentará convertirlo por usted:

Aviso dije «try» – si astype() no sabe cómo convertir un valor en la serie o DataFrame, generará un error. Por ejemplo, si tiene un valor NaN o inf obtendrá un error al intentar convertirlo en un entero.

a partir de pandas 0.20.,0, este error se puede suprimir pasando errors='ignore'. Su objeto original será devuelto sin tocar.

tenga cuidado

astype() es poderosa, pero a veces va a convertir valores «incorrectamente». Por ejemplo:

>>> s = pd.Series()>>> s0 11 22 -7dtype: int64

estos son enteros pequeños, así que ¿qué tal convertir a un tipo de 8 bits sin signo para guardar memoria?

>>> s.astype(np.uint8)0 11 22 249dtype: uint8

la conversión funcionó, pero el -7 se envolvió para convertirse en 249 (es decir, 28 – 7)!

intentar bajar la señal usando pd.to_numeric(s, downcast='unsigned') en su lugar podría ayudar a prevenir este error.,

infer_objects ()

la versión 0.21.0 de pandas introdujo el método infer_objects() para convertir columnas de un DataFrame que tienen un tipo de datos objeto a un tipo más específico (conversiones suaves).

por ejemplo, aquí hay un DataFrame con dos columnas de tipo objeto. Uno contiene enteros reales y el otro contiene cadenas que representan enteros:

>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object

Usando infer_objects(), puede cambiar el tipo de columna ‘A’ a int64:

>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object

La Columna ‘b’ se ha dejado sola ya que sus valores eran cadenas, no enteros., Si quería intentar forzar la conversión de ambas columnas a un tipo entero, puede usar df.astype(int) en su lugar.

convert_dtypes()

la versión 1.0 y superior incluye un método convert_dtypes()para convertir series y columnas de DataFrame al mejor dtype posible que admita el valor que falta pd.NA.

Aquí «mejor posible» significa el tipo más adecuado para mantener los valores., Por ejemplo, este es un tipo entero pandas si todos los valores son enteros( o valores faltantes): una columna de objeto de objetos enteros de Python se convierte en Int64, una columna de NumPy int32 los valores se convertirán en el dtype pandas Int32.,

con nuestro object DataFrame df, obtenemos el siguiente resultado:

>>> df.convert_dtypes().dtypes a Int64b stringdtype: object

dado que la columna ‘a’ contenía valores enteros, se convirtió al Int64 type (que es capaz de contener valores faltantes, a diferencia de int64).

La Columna ‘ b ‘contenía objetos de cadena, por lo que se cambió a pandas’ string dtype.

de forma predeterminada, este método inferirá el tipo A partir de los valores del objeto en cada columna., Podemos cambiar esta pasando infer_objects=False:

>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object

Ahora la columna ‘a’ se mantuvo una columna de objeto: pandas sabe que puede ser descrito como un ‘entero’ columna (internamente se corrió infer_dtype), pero no deducir exactamente lo dtype de entero debe tener para no convertir. La columna ‘ b ‘fue nuevamente convertida a dtype’ string ‘ ya que fue reconocida como conteniendo valores ‘string’.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *