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)

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)

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 .


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

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'])

7
Les colonnes datetime sont d'un type différent qui datetimene sont pas des types numériques
Jeru Luke


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


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 

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

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.


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.