Я бы сказал, что это более элегантное решение. Спасибо
как если бы
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
011.01j a
122.02j b
233.03j c
df.dtypes
Out:
A int64
B float64
C complex128
D object
dtype: object
Это, похоже, не работает надежно с пандами DataFrames, поскольку они могут возвращать категории, неизвестные numpy, такие как «категория». Затем Numpy выдает «TypeError: тип данных не понят»
Томас
23
Основываясь на ответе @jaime в комментариях, вам нужно проверить .dtype.kindинтересующий столбец. Например;
Вот список всех типов dtype [1]. Нижний регистр uпредназначен для целого числа без знака; прописные буквы Uпредназначены для юникода. [1]: docs.scipy.org/doc/numpy/reference/generated/…
cbarrick
7
У Pandas есть select_dtypeфункция. Вы можете легко фильтровать свои столбцы в int64 и float64 следующим образом:
Это псевдовнутренний метод, возвращающий только данные числового типа.
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
00-0.667672 foo 2013-01-0100:00:00110.811300 bar 2013-01-0100:00:00222.020402 bah 2013-01-0100: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
00-0.667672110.811300222.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
Когда я делаю следующее, мне кажется, что это дает точный результат:
dtype.kind in 'biufc'
.Ответы:
В
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
источник
Вы можете использовать,
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
источник
Основываясь на ответе @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
:b
bool,i
int (знаковый),u
unsigned int,f
float,c
complex. См. Https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind.источник
u
предназначен для целого числа без знака; прописные буквыU
предназначены для юникода. [1]: docs.scipy.org/doc/numpy/reference/generated/…У Pandas есть
select_dtype
функция. Вы можете легко фильтровать свои столбцы в int64 и float64 следующим образом:df.select_dtypes(include=['int64','float64'])
источник
Это псевдовнутренний метод, возвращающий только данные числового типа.
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
источник
Как насчет проверки типа одного из значений в столбце? У нас всегда было что-то подобное:
Когда я пытаюсь проверить типы данных для столбцов в нижеприведенном фрейме данных, я получаю их как «объект», а не как ожидаемый числовой тип:
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
источник
Чтобы добавить ко всем другим ответам, можно также использовать,
df.info()
чтобы узнать тип данных каждого столбца.источник
Вы можете проверить, содержит ли данный столбец числовые значения или нет, используя dtypes
numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']
Примечание. "O" должно быть заглавной.
источник
Вы также можете попробовать:
df_dtypes = np.array(df.dtypes) df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]
Он возвращает список логических значений:
True
если числовой,False
если нет.источник