Как определить, является ли столбец / переменная числовой или нет в Pandas / NumPy?


88

Есть ли лучший способ определить, включена ли переменная Pandasи / или NumPyесть numericили нет?

У меня есть определенный себя dictionaryс dtypesкак ключи и numeric/ в notкачестве значений.


15
Вы можете проверить dtype.kind in 'biufc'.
Jaime

1
Комментарий над этим, опубликованным Хайме, был проще, чем те, что ниже, и, кажется, работал отлично ...... спасибо
hfrog713

Ответы:


97

В pandas 0.20.2это можно сделать:

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

Я бы сказал, что это более элегантное решение. Спасибо
как если бы

84

Вы можете использовать, np.issubdtypeчтобы проверить, является ли dtype подтипом np.number. Примеры:

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

Это работает для dtypes numpy, но не работает для конкретных типов pandas, таких как pd.Categorical as Thomas заметил . Если вы используете is_numeric_dtypeфункцию категорий от pandas, это лучшая альтернатива, чем 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

Для нескольких столбцов вы можете использовать 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)

А для выбора у панд теперь есть 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

1
Это, похоже, не работает надежно с пандами DataFrames, поскольку они могут возвращать категории, неизвестные numpy, такие как «категория». Затем Numpy выдает «TypeError: тип данных не понят»
Томас

23

Основываясь на ответе @jaime в комментариях, вам нужно проверить .dtype.kindинтересующий столбец. Например;

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

NB Значение biufc: bbool, iint (знаковый), uunsigned int, ffloat, ccomplex. См. Https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind.


3
Вот список всех типов dtype [1]. Нижний регистр uпредназначен для целого числа без знака; прописные буквы Uпредназначены для юникода. [1]: docs.scipy.org/doc/numpy/reference/generated/…
cbarrick

7

У Pandas есть select_dtypeфункция. Вы можете легко фильтровать свои столбцы в int64 и float64 следующим образом:

df.select_dtypes(include=['int64','float64'])

4

Это псевдовнутренний метод, возвращающий только данные числового типа.

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

Да, я пытался понять, как они это делают. Можно было бы ожидать, что внутренняя функция IsNumeric запускается для каждого столбца ... но все еще не нашла ее в коде
user2808117

Вы можете применить это для каждого столбца, но намного проще просто проверить dtype. в любом случае операции pandas при необходимости исключают нечисловые. Что ты пытаешься сделать?
Джефф

4

Как насчет проверки типа одного из значений в столбце? У нас всегда было что-то подобное:

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

Когда я пытаюсь проверить типы данных для столбцов в нижеприведенном фрейме данных, я получаю их как «объект», а не как ожидаемый числовой тип:

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

Когда я делаю следующее, мне кажется, что это дает точный результат:

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

возвращается

True

1

Чтобы добавить ко всем другим ответам, можно также использовать, df.info()чтобы узнать тип данных каждого столбца.


1

Вы можете проверить, содержит ли данный столбец числовые значения или нет, используя dtypes

numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']

Примечание. "O" должно быть заглавной.


0

Вы также можете попробовать:

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

Он возвращает список логических значений: Trueесли числовой, Falseесли нет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.