Come trovo le colonne numeriche in Panda?


121

Diciamo che dfè un DataFrame dei panda. Vorrei trovare tutte le colonne di tipo numerico. Qualcosa di simile a:

isNumeric = is_numeric(df)

Si dovrebbe specificare se una colonna che ha dtypedi essere object, ma tutti gli elementi essendo numerico, conta come numerico o no. Se no, prendi la risposta di Hanan, poiché è anche più veloce. Altrimenti, prendi il mio.
FooBar

Cosa succede se provi semplicemente df.describe (). Columns. Quindi assegnalo a una variabile.
freddo

Risposte:


146

Potresti usare il select_dtypesmetodo di DataFrame. Include due parametri include ed exclude. Quindi isNumeric sarebbe simile a:

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

newdf = df.select_dtypes(include=numerics)

94
Puoi usare df.select_dtypes (include = [np.number]) se non hai bisogno di specificare un elenco "
numerico

23
Basandosi sul suggerimento nel commento precedente (+1), potresti semplicemente usare list(df.select_dtypes(include=[np.number]).columns.values) per ottenere un elenco di nomi delle colonne numeriche
user799188

76

È possibile utilizzare la funzione non documentata _get_numeric_data() per filtrare solo le colonne numeriche:

df._get_numeric_data()

Esempio:

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

Si noti che questo è un "metodo privato" (cioè un dettaglio di implementazione) ed è soggetto a modifiche o rimozione totale in futuro. Usare con cautela .


1
Super maneggevole; è documentato da qualche parte? Preoccupato per la sua scomparsa nelle versioni future e / o instabilità, poiché il suo carattere di sottolineatura prefisso indica che è destinato a essere privato.
ijoseph

3
No, questo non è documentato da nessuna parte. L'implementazione è qui , tuttavia, come menzionato da @ijoseph, sarei diffidente nell'usare metodi che iniziano con trattini bassi poiché sono poco più che dettagli di implementazione. Usa letteralmente QUALSIASI altra risposta oltre a questa.
cs95

Esattamente. Come best practice, cerco di utilizzare e convertire il maggior numero possibile di metodi numpy. Ciò è dovuto al dinamismo dei panda. L'API cambia frequentemente. Per i metodi non documentati è semplicemente sconsiderato, non importa quanto sia utile.
mik

69

Semplice risposta di una riga per creare un nuovo dataframe con solo colonne numeriche:

df.select_dtypes(include=np.number)

Se vuoi i nomi delle colonne numeriche:

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

Codice 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 desideri un solo tipo, non è necessario memorizzarlo in un elenco. Né è necessario specificare include=. select_dtypes(np.number)
Ballpoint

Se le tue colonne hanno dati numerici ma hanno anche Nessuno, il dtype potrebbe essere "oggetto". Questo costringerà le colonne a numeriche:df.fillna(value=0, inplace=True)
vaughnkoch

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

7
Le colonne datetime sono di un tipo diverso datetimee non sono tipi numerici
Jeru Luke

15

Semplice one-liner:

df.select_dtypes('number').columns

2
Di gran lunga il modo più pitonico, sì.
jorijnsmit

6

I seguenti codici restituiranno l'elenco dei nomi delle colonne numeriche di un set di dati.

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

ecco il marketing_trainmio set di dati ed select_dtypes()è la funzione per selezionare i tipi di dati utilizzando escludi e includi argomenti e le colonne vengono utilizzate per recuperare il nome della colonna del set di dati, l'output del codice sopra sarà il seguente:

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

Grazie


4

Questo è un altro semplice codice per trovare una colonna numerica nel frame di dati dei panda,

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

Adattare questa risposta , potresti farlo

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

Qui, np.applymap(np.isreal)mostra se ogni cella nel frame di dati è numerica e .axis(all=0)controlla se tutti i valori in una colonna sono True e restituisce una serie di valori booleani che possono essere utilizzati per indicizzare le colonne desiderate.


1

Si prega di vedere il codice seguente:

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

In questo modo puoi verificare se i valori sono numerici come float e int oppure i valori srting. la seconda istruzione if viene utilizzata per controllare i valori di stringa a cui fa riferimento l'oggetto.


1

Possiamo includere ed escludere tipi di dati secondo il requisito come di seguito:

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

Riferito da Jupyter Notebook.

Per selezionare tutti i tipi numerici , utilizzare np.numbero'number'

  • Per selezionare le stringhe devi usare objectdtype ma nota che questo restituirà tutte le colonne dtype dell'oggetto

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

  • Per selezionare i datetimes, usa np.datetime64, 'datetime'o 'datetime64'

  • Per selezionare timedeltas, utilizzare np.timedelta64, 'timedelta'o 'timedelta64'

  • Per selezionare i tipi di categoria di Panda, utilizzare 'category'

  • Per selezionare Pandas datetimetz dtypes, usa 'datetimetz'(new in 0.20.0) o `` 'datetime64 [ns, tz]'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.