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)
Hanan Shteingart
fonte
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)
Anand
fonte
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 .

Kathirmani Sukumar
fonte
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']
stackoverflowuser2010
fonte
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'])
BEN_YO
fonte
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
nimbous
fonte
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

Hukmaram
fonte
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 
Anvesh_vs
fonte
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
fonte
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.

Garrett
fonte
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.

mickey
fonte
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]'

Muralitharan Sathyamoorthy
fonte