Necesito usar diferentes funciones para tratar columnas numéricas y columnas de cadena. Lo que estoy haciendo ahora es realmente tonto:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
¿Hay alguna forma más elegante de hacer esto? P.ej
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
no es un dtypeRespuestas:
Puede acceder al tipo de datos de una columna con
dtype
:fuente
treat_numeric
. Como él incluyóagg.dtypes==np.float64
como opción, yo también.number
aquí: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html La solución general esis_numeric_dtype(agg[y])
En
pandas 0.20.2
puedes hacer:Entonces su código se convierte en:
fuente
pandas.core.common.is_numeric_dtype
ha existido desde Pandas 0.13, y hace lo mismo, pero fue desaprobado a favorpandas.api.types.is_numeric_dtype
en 0.19, creoSé que esto es un poco viejo pero con pandas 19.02, puedes hacer:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
fuente
include[np.number]
(para incluir también ints y flotantes de 32 bits) para la primera línea yexclude[object]
para la segunda línea. Las cadenas son objetos en lo que respecta a los tipos de letra. De hecho, incluir 'string' con objeto me da un error.'period'
dtype está subiendoNotImplementedError
por ahora (pandas 0.24.2). Por lo tanto, uno puede necesitar un procesamiento posterior hecho a mano.El título de la pregunta formulada es general, pero el caso de uso de los autores indicado en el cuerpo de la pregunta es específico. Por lo tanto, se pueden utilizar otras respuestas.
Pero para responder completamente a la pregunta del título , debe aclararse que parece que todos los enfoques pueden fallar en algunos casos y requerir un poco de revisión. Los revisé todos (y algunos adicionales) para disminuir el orden de confiabilidad (en mi opinión):
1. Comparación de tipos directamente a través de
==
(respuesta aceptada).A pesar del hecho de que esta es una respuesta aceptada y tiene la mayoría de los votos a favor, creo que este método no debería usarse en absoluto. Porque, de hecho, este enfoque se desaconseja en Python como se menciona varias veces aquí .
Pero si todavía lo quieren usar - debe ser consciente de algunas dtypes pandas-específicos como
pd.CategoricalDType
,pd.PeriodDtype
opd.IntervalDtype
. Aquí hay que usar extratype( )
para reconocer dtype correctamente:Otra advertencia aquí es que ese tipo debe señalarse con precisión:
2.
isinstance()
enfoque.Este método no se ha mencionado en las respuestas hasta ahora.
Así que si la comparación directa de los tipos no es una buena idea - vamos a tratar función integrada de Python para este propósito, a saber -
isinstance()
.Falla solo al principio, porque supone que tenemos algunos objetos, pero
pd.Series
opd.DataFrame
podemos usarlos como contenedores vacíos condtype
objetos predefinidos pero sin ningún objeto:Pero si de alguna manera se supera este problema y quiere acceder a cada objeto, por ejemplo, en la primera fila y comprueba su tipo de letra de esta manera:
Será engañoso en el caso de un tipo mixto de datos en una sola columna:
Y por último, pero no menos importante: este método no puede reconocer directamente
Category
dtype. Como se indica en los documentos :Entonces este método también es casi inaplicable.
3.
df.dtype.kind
enfoque.Este método aún puede funcionar con vacío
pd.Series
opd.DataFrames
tiene otros problemas.Primero: no puede diferir algunos tipos:
En segundo lugar, lo que en realidad todavía no está claro para mí, incluso regresa en algunos tipos . Ninguno .
4.
df.select_dtypes
enfoque.Esto es casi lo que queremos. Este método está diseñado dentro de los pandas para que maneje la mayoría de los casos de esquina mencionados anteriormente: marcos de datos vacíos, difiere bien los tipos de numpy o específicos de pandas. Funciona bien con un solo tipo de letra
.select_dtypes('bool')
. Puede usarse incluso para seleccionar grupos de columnas basados en dtype:Así, como se indica en los documentos :
Puede pensar que aquí vemos los primeros resultados inesperados (solía ser para mí: pregunta ) -
TimeDelta
se incluye en la salidaDataFrame
. Pero, como se respondió al contrario, debería ser así, pero uno debe ser consciente de ello. Tenga en cuenta quebool
se omite dtype, que también puede ser indeseable para alguien, pero se debebool
ynumber
está en diferentes " subárboles " de dtypes numpy. En caso de bool, podemos usartest.select_dtypes(['bool'])
aquí.La siguiente restricción de este método es que para la versión actual de pandas (0.24.2), este código:
test.select_dtypes('period')
se elevaráNotImplementedError
.Y otra cosa es que no puede diferenciar cadenas de otros objetos:
Pero esto es, primero, ya mencionado en los documentos. Y segundo, no es el problema de este método, sino la forma en que se almacenan las cadenas
DataFrame
. Pero de todos modos este caso tiene que tener algún procesamiento posterior.5.
df.api.types.is_XXX_dtype
enfoque.Se supone que esta es la forma más robusta y nativa de lograr el reconocimiento de dtype (supongo que la ruta del módulo donde residen las funciones dice). Y funciona casi perfectamente, pero todavía tiene al menos una advertencia y aún tiene que distinguir de alguna manera las columnas de cadena .
Además, esto puede ser subjetivo, pero este enfoque también tiene más
number
procesamiento de grupos de tipos de dty 'comprensibles para humanos ' en comparación con.select_dtypes('number')
:No
timedelta
ybool
está incluido. Perfecto.Mi canalización explota exactamente esta funcionalidad en este momento, más un poco de procesamiento manual posterior.
Salida.
Espero haber podido argumentar el punto principal: que todos los enfoques discutidos pueden usarse, pero solo
pd.DataFrame.select_dtypes()
ypd.api.types.is_XXX_dtype
realmente deberían considerarse como los aplicables.fuente
Si desea marcar el tipo de una columna de marco de datos como una cadena, puede hacer lo siguiente:
Un ejemplo:
La respuesta para tu código:
fuente
Para imprimir bastante los tipos de datos de columna
Para verificar los tipos de datos después de, por ejemplo, una importación desde un archivo
Salida ilustrativa:
fuente