web-dev-qa-db-fra.com

Comment déterminer si une colonne/variable est numérique ou non dans Pandas/NumPy?

Existe-t-il un meilleur moyen de déterminer si une variable dans Pandas et/ou NumPy est numeric ou non? 

J'ai défini moi-même dictionary avec dtypes comme clés et numeric/not comme valeurs.

42
user2808117

Vous pouvez utiliser np.issubdtype pour vérifier si le type est un sous-type de np.number. Exemples:

np.issubdtype(arr.dtype, np.number)  # where arr is a numpy array
np.issubdtype(df['X'].dtype, np.number)  # where df['X'] is a pandas Series

Cela fonctionne pour les types de numpy mais échoue pour les types spécifiques de pandas comme pd.Categorical comme Thomas a noté . Si vous utilisez des catégories is_numeric_dtype la fonction de pandas est une meilleure alternative que np.issubdtype.

df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 
                   'C': [1j, 2j, 3j], 'D': ['a', 'b', 'c']})
df
Out: 
   A    B   C  D
0  1  1.0  1j  a
1  2  2.0  2j  b
2  3  3.0  3j  c

df.dtypes
Out: 
A         int64
B       float64
C    complex128
D        object
dtype: object

np.issubdtype(df['A'].dtype, np.number)
Out: True

np.issubdtype(df['B'].dtype, np.number)
Out: True

np.issubdtype(df['C'].dtype, np.number)
Out: True

np.issubdtype(df['D'].dtype, np.number)
Out: False

Pour plusieurs colonnes, vous pouvez utiliser np.vectorize:

is_number = np.vectorize(lambda x: np.issubdtype(x, np.number))
is_number(df.dtypes)
Out: array([ True,  True,  True, False], dtype=bool)

Et pour la sélection, pandas a maintenant select_dtypes :

df.select_dtypes(include=[np.number])
Out: 
   A    B   C
0  1  1.0  1j
1  2  2.0  2j
2  3  3.0  3j
49
ayhan

Dans pandas 0.20.2 vous pouvez faire:

import pandas as pd
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype

df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1.0, 2.0, 3.0]})

is_string_dtype(df['A'])
>>>> True

is_numeric_dtype(df['B'])
>>>> True
36
danthelion

Sur la base de la réponse de @ jaime dans les commentaires, vous devez vérifier .dtype.kind pour la colonne qui vous intéresse. Par exemple;

>>> import pandas as pd
>>> df = pd.DataFrame({'numeric': [1, 2, 3], 'not_numeric': ['A', 'B', 'C']})
>>> df['numeric'].dtype.kind in 'bifc'
>>> True
>>> df['not_numeric'].dtype.kind in 'bifc'
>>> False

NB bifc est b bool, i int, f float, c complex - Je ne suis pas sûr de ce que u pourrait être.

10
danodonovan

C'est une méthode pseudo-interne pour renvoyer uniquement les données de type numérique

In [27]: df = DataFrame(dict(A = np.arange(3), 
                             B = np.random.randn(3), 
                             C = ['foo','bar','bah'], 
                             D = Timestamp('20130101')))

In [28]: df
Out[28]: 
   A         B    C                   D
0  0 -0.667672  foo 2013-01-01 00:00:00
1  1  0.811300  bar 2013-01-01 00:00:00
2  2  2.020402  bah 2013-01-01 00:00:00

In [29]: df.dtypes
Out[29]: 
A             int64
B           float64
C            object
D    datetime64[ns]
dtype: object

In [30]: df._get_numeric_data()
Out[30]: 
   A         B
0  0 -0.667672
1  1  0.811300
2  2  2.020402
3
Jeff

Pourquoi ne pas vérifier le type d'une des valeurs de la colonne? Nous avons toujours eu quelque chose comme ça:

isinstance(x, (int, long, float, complex))

Lorsque j'essaie de vérifier les types de données des colonnes dans la structure de données ci-dessous, je les ai sous forme d'objet et non de type numérique:

df = pd.DataFrame(columns=('time', 'test1', 'test2'))
for i in range(20):
    df.loc[i] = [datetime.now() - timedelta(hours=i*1000),i*10,i*100]
df.dtypes

time     datetime64[ns]
test1            object
test2            object
dtype: object

Lorsque je fais ce qui suit, cela semble me donner un résultat précis:

isinstance(df['test1'][len(df['test1'])-1], (int, long, float, complex))

résultats

True
2
Punit S

Juste pour ajouter à toutes les autres réponses, on peut aussi utiliser df.info() pour obtenir quel type de données de chaque colonne 

1
Beta

Vous pouvez aussi essayer:

df_dtypes = np.array(df.dtypes)
df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]

Il retourne une liste de booléens: True si numérique, False sinon.

0
paulwasit