Comment trouver des colonnes numériques dans Pandas?

121

Disons que dfc'est un DataFrame pandas. Je voudrais trouver toutes les colonnes de type numérique. Quelque chose comme:

isNumeric = is_numeric(df)
Hanan Shteingart
la source
Vous devez spécifier si une colonne contenant un dtypeêtre object, mais tous les éléments étant numériques, compte comme numérique ou non. Si non, prenez la réponse de Hanan, car elle est également plus rapide. Sinon, prenez le mien.
FooBar
Que se passe-t-il si vous essayez simplement df.describe (). Columns. Attribuez-le ensuite à une variable.
coldy

Réponses:

146

Vous pouvez utiliser la select_dtypesméthode DataFrame. Il comprend deux paramètres inclure et exclure. Donc isNumeric ressemblerait à:

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

newdf = df.select_dtypes(include=numerics)
Anand
la source
94
Vous pouvez utiliser df.select_dtypes (include = [np.number]) si vous n'avez pas besoin de spécifier une liste «numérique»
KieranPC
23
En vous basant sur l'astuce du commentaire précédent (+1), vous pouvez simplement utiliser list(df.select_dtypes(include=[np.number]).columns.values) pour obtenir une liste des noms des colonnes numériques
user799188
76

Vous pouvez utiliser la fonction non documentée _get_numeric_data()pour filtrer uniquement les colonnes numériques:

df._get_numeric_data()

Exemple:

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

Notez qu'il s'agit d'une "méthode privée" (c'est-à-dire, un détail d'implémentation) et est susceptible d'être modifiée ou supprimée à l'avenir. Utilisez avec prudence .

Kathirmani Sukumar
la source
1
Super pratique; est-ce documenté quelque part? Préoccupé par sa disparition dans les futures versions et / ou son instabilité, car son préfixe de soulignement indique qu'il est censé être privé.
ijoseph
3
Non, cela n'est documenté nulle part. L'implémentation est ici , cependant, comme @ijoseph l'a mentionné, je me méfierais d'utiliser des méthodes qui commencent par des traits de soulignement car elles ne sont guère plus que des détails d'implémentation. Utilisez littéralement TOUTE autre réponse en plus de cela.
cs95
Exactement. En tant que meilleure pratique, j'essaie d'utiliser et de convertir autant de méthodes numpy que possible. Cela est dû au dynamisme des pandas. L'API change fréquemment. Pour les méthodes non documentées, c'est tout simplement imprudent, aussi utile soit-il.
mik
69

Réponse simple en une ligne pour créer un nouveau dataframe avec uniquement des colonnes numériques:

df.select_dtypes(include=np.number)

Si vous voulez les noms des colonnes numériques:

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

Code complet:

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
la source
2
df.select_dtypes(include=['int64']).columns.tolist()
Cherry Wu
Si vous ne voulez qu'un seul type, vous n'avez pas besoin de le stocker dans une liste. Vous n'avez pas non plus besoin de préciser include=. select_dtypes(np.number)
BallpointBen
Si vos colonnes ont des données numériques mais ont également None, le dtype peut être "object". Cela contraindra les colonnes au numérique:df.fillna(value=0, inplace=True)
vaughnkoch
26
df.select_dtypes(exclude=['object'])
BEN_YO
la source
7
Les colonnes datetime sont d'un type différent qui datetimene sont pas des types numériques
Jeru Luke
15

Une seule ligne simple:

df.select_dtypes('number').columns
méchant
la source
2
De loin la manière la plus pythonique, oui.
jorijnsmit le
6

Les codes suivants renverront la liste des noms des colonnes numériques d'un ensemble de données.

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

voici marketing_trainmon ensemble de données et sa select_dtypes()fonction pour sélectionner les types de données à l'aide des arguments d'exclusion et d'inclusion et les colonnes sont utilisées pour récupérer le nom de la colonne de la sortie de l'ensemble de données du code ci-dessus sera le suivant:

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

Merci

Hukmaram
la source
4

Ceci est un autre code simple pour trouver une colonne numérique dans la trame de données pandas,

numeric_clmns = df.dtypes[df.dtypes != "object"].index 
Anvesh_vs
la source
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
la source
1

En adaptant cette réponse , vous pourriez faire

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

Ici, np.applymap(np.isreal)montre si chaque cellule de la trame de données est numérique et .axis(all=0)vérifie si toutes les valeurs d'une colonne sont True et renvoie une série de valeurs booléennes pouvant être utilisées pour indexer les colonnes souhaitées.

Garrett
la source
1

Veuillez consulter le code ci-dessous:

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 cette façon, vous pouvez vérifier si la valeur est numérique telle que float et int ou les valeurs srting. la seconde instruction if est utilisée pour vérifier les valeurs de chaîne référencées par l'objet.

Mickey
la source
1

Nous pouvons inclure et exclure des types de données selon l'exigence ci-dessous:

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

Fait référence à Jupyter Notebook.

Pour sélectionner tous les types numériques , utilisez np.numberou'number'

  • Pour sélectionner des chaînes, vous devez utiliser le objectdtype mais notez que cela renverra toutes les colonnes d'objet dtype

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

  • Pour sélectionner datetimes, l' utilisation np.datetime64, 'datetime'ou 'datetime64'

  • Pour sélectionner timedeltas, l' utilisation np.timedelta64, 'timedelta'ou 'timedelta64'

  • Pour sélectionner des dtypes catégoriques Pandas, utilisez 'category'

  • Pour sélectionner les types de données Pandas datetimetz, utilisez 'datetimetz'(nouveau dans 0.20.0) ou `` 'datetime64 [ns, tz]'

Muralitharan Sathyamoorthy
la source