Como encontro colunas numéricas no Pandas?


121

Digamos que dfseja um DataFrame do pandas. Eu gostaria de encontrar todas as colunas do tipo numérico. Algo como:

isNumeric = is_numeric(df)

Você deve especificar se uma coluna que tem dtypede ser object, mas todos os elementos sendo numérico, conta como numérico ou não. Se não, aceite a resposta de Hanan, pois também é mais rápida. Caso contrário, pegue o meu.
FooBar

O que acontece se você simplesmente tentar as colunas df.describe (). Em seguida, atribua-o a uma variável.
Coldy

Respostas:


146

Você pode usar o select_dtypesmétodo de DataFrame. Inclui dois parâmetros incluem e excluem. Portanto, isNumeric seria semelhante a:

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

newdf = df.select_dtypes(include=numerics)

94
Você pode usar df.select_dtypes (include = [np.number]) se não precisar especificar uma lista '
numérica

23
Com base na dica do comentário anterior (+1), você poderia usar apenas list(df.select_dtypes(include=[np.number]).columns.values) para obter uma lista de nomes das colunas numéricas
user799188

76

Você pode usar a função não documentada _get_numeric_data()para filtrar apenas colunas numéricas:

df._get_numeric_data()

Exemplo:

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

Observe que este é um "método privado" (ou seja, um detalhe de implementação) e está sujeito a alterações ou remoção total no futuro. Use com cuidado .


1
Super prático; isso está documentado em algum lugar? Preocupado com seu desaparecimento em versões futuras e / ou instabilidade, pois seu prefixo sublinhado indica que é para ser privado.
ijoseph de

3
Não, isso não está documentado em lugar nenhum. A implementação está aqui , no entanto, como @ijoseph mencionou, eu seria cauteloso ao usar métodos que começam com sublinhados, pois eles são pouco mais do que detalhes de implementação. Use literalmente QUALQUER outra resposta além desta.
cs95 de

Exatamente. Como prática recomendada, tento usar e converter o máximo possível de métodos numpy. Isso se deve ao dinamismo dos pandas. A API muda com freqüência. Para métodos não documentados, é simplesmente imprudente, não importa o quão útil seja.
mik

69

Resposta simples de uma linha para criar um novo dataframe com apenas colunas numéricas:

df.select_dtypes(include=np.number)

Se você quiser os nomes das colunas 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']

2
df.select_dtypes(include=['int64']).columns.tolist()
Cherry Wu

Se você deseja apenas um tipo, não precisa armazená-lo em uma lista. Nem você precisa especificar include=. select_dtypes(np.number)
BallpointBen

Se suas colunas possuem dados numéricos, mas também nenhum, o dtype pode ser 'objeto'. Isso forçará as colunas a ser numéricas:df.fillna(value=0, inplace=True)
vaughnkoch

26
df.select_dtypes(exclude=['object'])

7
colunas datetime são de um tipo diferente datetimee não são numéricos
Jeru Lucas

15

One-liner simples:

df.select_dtypes('number').columns

2
De longe a maneira mais pitônica, sim.
jorijnsmit

6

Os códigos a seguir retornarão uma lista de nomes das colunas numéricas de um conjunto de dados.

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

aqui marketing_trainestá meu conjunto de dados e select_dtypes()é uma função para selecionar tipos de dados usando argumentos de exclusão e inclusão e colunas é usado para buscar o nome da coluna de saída do conjunto de dados do código acima será o seguinte:

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

obrigado


4

Este é outro código simples para encontrar colunas numéricas no quadro de dados do pandas,

numeric_clmns = df.dtypes[df.dtypes != "object"].index 

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)

1

Adaptando esta resposta , você poderia fazer

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

Aqui, np.applymap(np.isreal)mostra se cada célula no quadro de dados é numérica e .axis(all=0)verifica se todos os valores em uma coluna são Verdadeiros e retorna uma série de Booleanos que podem ser usados ​​para indexar as colunas desejadas.


1

Por favor, veja o código abaixo:

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())

Dessa forma, você pode verificar se os valores são numéricos, como float e int ou os valores srting. a segunda instrução if é usada para verificar os valores de string que são referidos pelo objeto.


1

Podemos incluir e excluir tipos de dados de acordo com os requisitos abaixo:

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

Referido do Jupyter Notebook.

Para selecionar todos os tipos numéricos , use np.numberou'number'

  • Para selecionar as strings você deve usar o objectdtype mas note que isso irá retornar todas as colunas do objeto dtype

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

  • Para selecionar datas, use np.datetime64, 'datetime'ou 'datetime64'

  • Para selecionar timedeltas, use np.timedelta64, 'timedelta'ou 'timedelta64'

  • Para selecionar dtipos categóricos do Pandas, use 'category'

  • Para selecionar os dtipos datetimetz do Pandas, use 'datetimetz'(novo no 0.20.0) ou `` 'datetime64 [ns, tz]'

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.