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 int64
o 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’.