¿Cómo encuentro columnas numéricas en Pandas?

121

Digamos que dfes un DataFrame de pandas. Me gustaría encontrar todas las columnas de tipo numérico. Algo como:

isNumeric = is_numeric(df)
Hanan Shteingart
fuente
Debe especificar si una columna que tiene dtypeser object, pero todos los elementos son numéricos, cuenta como numérica o no. Si no, tome la respuesta de Hanan, ya que también es más rápido. De lo contrario, toma el mío.
FooBar
¿Qué sucede si simplemente prueba las columnas df.describe (). Luego asígnelo a una variable.
frío

Respuestas:

146

Puede utilizar el select_dtypesmétodo de DataFrame. Incluye dos parámetros incluir y excluir. Entonces isNumeric se vería así:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']

newdf = df.select_dtypes(include=numerics)
Anand
fuente
94
Puede usar df.select_dtypes (include = [np.number]) si no necesita especificar una lista de 'numéricos'
KieranPC
23
Sobre la base de la sugerencia del comentario anterior (+1), podría usar list(df.select_dtypes(include=[np.number]).columns.values) para obtener una lista de nombres de las columnas numéricas
usuario799188
76

Puede usar la función no documentada _get_numeric_data()para filtrar solo columnas numéricas:

df._get_numeric_data()

Ejemplo:

In [32]: data
Out[32]:
   A  B
0  1  s
1  2  s
2  3  s
3  4  s

In [33]: data._get_numeric_data()
Out[33]:
   A
0  1
1  2
2  3
3  4

Tenga en cuenta que este es un "método privado" (es decir, un detalle de implementación) y está sujeto a cambios o eliminación total en el futuro. Úselo con precaución .

Kathirmani Sukumar
fuente
1
Super práctico; ¿Está esto documentado en alguna parte? Preocupado por su desaparición en futuras versiones y / o inestabilidad, ya que su prefijo de subrayado indica que está destinado a ser privado.
ijoseph
3
No, esto no está documentado en ninguna parte. La implementación está aquí , sin embargo, como @ijoseph mencionó, sería cauteloso al usar métodos que comienzan con guiones bajos, ya que son poco más que detalles de implementación. Use literalmente CUALQUIER otra respuesta además de esta.
cs95
Exactamente. Como mejor práctica, trato de usar y convertir a tantos métodos numpy como sea posible. Esto se debe al dinamismo de los pandas. La API cambia con frecuencia. Para los métodos indocumentados es simplemente imprudente, sin importar cuán útil sea.
mik
69

Respuesta simple de una línea para crear un nuevo marco de datos con solo columnas numéricas:

df.select_dtypes(include=np.number)

Si desea los nombres de las columnas numéricas:

df.select_dtypes(include=np.number).columns.tolist()

Código completo:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': range(7, 10),
                   'B': np.random.rand(3),
                   'C': ['foo','bar','baz'],
                   'D': ['who','what','when']})
df
#    A         B    C     D
# 0  7  0.704021  foo   who
# 1  8  0.264025  bar  what
# 2  9  0.230671  baz  when

df_numerics_only = df.select_dtypes(include=np.number)
df_numerics_only
#    A         B
# 0  7  0.704021
# 1  8  0.264025
# 2  9  0.230671

colnames_numerics_only = df.select_dtypes(include=np.number).columns.tolist()
colnames_numerics_only
# ['A', 'B']
stackoverflowuser2010
fuente
2
df.select_dtypes(include=['int64']).columns.tolist()
Cherry Wu
Si solo desea un tipo, no es necesario que lo almacene en una lista. Tampoco es necesario especificar include=. select_dtypes(np.number)
BallpointBen
Si sus columnas tienen datos numéricos pero también Ninguno, el tipo d podría ser 'objeto'. Esto obligará a las columnas a ser numéricas:df.fillna(value=0, inplace=True)
vaughnkoch
26
df.select_dtypes(exclude=['object'])
BEN_YO
fuente
7
Las columnas de fecha y hora son de un tipo diferente datetimeque no son tipos numéricos
Jeru Luke
15

De una sola línea simple:

df.select_dtypes('number').columns
nimbo
fuente
2
De lejos, la forma más pitónica, sí.
jorijnsmit
6

Los siguientes códigos devolverán una lista de nombres de las columnas numéricas de un conjunto de datos.

cnames=list(marketing_train.select_dtypes(exclude=['object']).columns)

aquí marketing_trainestá mi conjunto de datos y la select_dtypes()función para seleccionar tipos de datos usando excluir e incluir argumentos y columnas se usa para buscar el nombre de columna del conjunto de datos, la salida del código anterior será la siguiente:

['custAge',
     'campaign',
     'pdays',
     'previous',
     'emp.var.rate',
     'cons.price.idx',
     'cons.conf.idx',
     'euribor3m',
     'nr.employed',
     'pmonths',
     'pastEmail']

Gracias

Hukmaram
fuente
4

Este es otro código simple para encontrar columnas numéricas en el marco de datos de pandas,

numeric_clmns = df.dtypes[df.dtypes != "object"].index 
Anvesh_vs
fuente
1
def is_type(df, baseType):
    import numpy as np
    import pandas as pd
    test = [issubclass(np.dtype(d).type, baseType) for d in df.dtypes]
    return pd.DataFrame(data = test, index = df.columns, columns = ["test"])
def is_float(df):
    import numpy as np
    return is_type(df, np.float)
def is_number(df):
    import numpy as np
    return is_type(df, np.number)
def is_integer(df):
    import numpy as np
    return is_type(df, np.integer)
Hanan Shteingart
fuente
1

Adaptando esta respuesta , podrías hacer

df.ix[:,df.applymap(np.isreal).all(axis=0)]

Aquí, np.applymap(np.isreal)muestra si todas las celdas del marco de datos son numéricas y .axis(all=0)comprueba si todos los valores de una columna son verdaderos y devuelve una serie de valores booleanos que se pueden usar para indexar las columnas deseadas.

Garrett
fuente
1

Consulte el siguiente código:

if(dataset.select_dtypes(include=[np.number]).shape[1] > 0):
display(dataset.select_dtypes(include=[np.number]).describe())
if(dataset.select_dtypes(include=[np.object]).shape[1] > 0):
display(dataset.select_dtypes(include=[np.object]).describe())

De esta manera, puede verificar si los valores son numéricos como float e int o los valores srting. la segunda instrucción if se usa para verificar los valores de cadena a los que hace referencia el objeto.

mickey
fuente
1

Podemos incluir y excluir tipos de datos según el requisito de la siguiente manera:

train.select_dtypes(include=None, exclude=None)
train.select_dtypes(include='number') #will include all the numeric types

Referido de Jupyter Notebook.

Para seleccionar todos los tipos numéricos , utilice np.numbero'number'

  • Para seleccionar cadenas, debe usar objectdtype, pero tenga en cuenta que esto devolverá todas las columnas de dtype de objeto

  • Ver el NumPy dtype hierarchy <http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html>__

  • Para seleccionar datetimes, uso np.datetime64, 'datetime'o 'datetime64'

  • Para seleccionar timedeltas, uso np.timedelta64, 'timedelta'o 'timedelta64'

  • Para seleccionar tipos categóricos de Pandas, use 'category'

  • Para seleccionar los tipos de fecha y hora de Pandas, use 'datetimetz'(nuevo en 0.20.0) o `` 'datetime64 [ns, tz]'

Muralitharan Sathyamoorthy
fuente