Как мне найти числовые столбцы в пандах?


121

Скажем, dfэто DataFrame панд. Я хочу найти все столбцы числового типа. Что-то вроде:

isNumeric = is_numeric(df)

Вы должны указать , считается ли столбец, который dtypeбыл object, но все элементы являются числовыми, как числовыми или нет. Если нет, возьмите ответ Ханана, он тоже быстрее. В противном случае возьмите мою.
FooBar

Что произойдет, если вы просто попробуете df.describe (). Columns. Затем присвойте его переменной.
холодный

Ответы:


146

Вы можете использовать select_dtypesметод DataFrame. Он включает два параметра: include и exclude. Итак, isNumeric будет выглядеть так:

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

newdf = df.select_dtypes(include=numerics)

94
Вы можете использовать df.select_dtypes (include = [np.number]), если вам не нужно указывать «числовой» список
KieranPC

23
Основываясь на подсказке из предыдущего комментария (+1), вы можете просто использовать list(df.select_dtypes(include=[np.number]).columns.values) для получения списка имен числовых столбцов
user799188,

77

Вы можете использовать недокументированную функцию _get_numeric_data()для фильтрации только числовых столбцов:

df._get_numeric_data()

Пример:

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

Обратите внимание, что это «частный метод» (т. Е. Деталь реализации), который может быть изменен или полностью удален в будущем. Используйте с осторожностью .


1
Супер удобно; это где-нибудь задокументировано? Обеспокоен его исчезновением в будущих версиях и / или нестабильностью, поскольку его префикс подчеркивания указывает на то, что он предназначен для частного использования.
ijoseph

3
Нет, это нигде не задокументировано. Однако реализация здесь , как упоминал @ijoseph, я бы с осторожностью использовал методы, которые начинаются с подчеркивания, поскольку они не более чем детали реализации. Используйте буквально ЛЮБОЙ другой ответ, кроме этого.
cs95

Именно. В качестве наилучшей практики я стараюсь использовать и преобразовывать как можно больше методов numpy. Это связано с динамизмом панд. API часто меняется. Для недокументированных методов это просто безрассудство, независимо от того, насколько оно полезно.
mik

69

Простой однострочный ответ для создания нового фрейма данных только с числовыми столбцами:

df.select_dtypes(include=np.number)

Если вам нужны имена числовых столбцов:

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

Полный код:

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

Если вам нужен только один тип, вам не нужно хранить его в списке. И указывать не нужно include=. select_dtypes(np.number)
BallpointBen

Если ваши столбцы имеют числовые данные, но также имеют значение None, тип dtype может быть 'object'. Это приведет к df.fillna(value=0, inplace=True)
преобразованию


15

Простой однострочный:

df.select_dtypes('number').columns

2
Безусловно, самый питонический способ, да.
jorijnsmit

6

Следующие коды вернут список имен числовых столбцов набора данных.

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

вот marketing_trainмой набор данных и select_dtypes()функция для выбора типов данных с использованием аргументов exclude и include, а столбцы используются для извлечения имени столбца набора данных, вывод которого приведен выше:

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

Спасибо


4

Это еще один простой код для поиска числового столбца во фрейме данных 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

Адаптировав этот ответ , вы могли бы сделать

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

Здесь np.applymap(np.isreal)показывает, является ли каждая ячейка во фрейме данных числовой, и .axis(all=0)проверяет, все ли значения в столбце равны True, и возвращает серию логических значений, которые можно использовать для индексации нужных столбцов.


1

Пожалуйста, посмотрите код ниже:

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())

Таким образом вы можете проверить, является ли значение числовым, например, float и int или srting. второй оператор if используется для проверки строковых значений, на которые ссылается объект.


1

Мы можем включать и исключать типы данных в соответствии с требованиями, указанными ниже:

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

Ссылка из Jupyter Notebook.

Чтобы выбрать все числовые типы, используйте np.numberили'number'

  • Чтобы выбрать строки, вы должны использовать objectdtype, но обратите внимание, что это вернет все столбцы dtype объекта

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

  • Для выбора DateTimes, использование np.datetime64, 'datetime'или 'datetime64'

  • Чтобы выбрать timedeltas, используйте np.timedelta64, 'timedelta'или 'timedelta64'

  • Чтобы выбрать категориальные типы Pandas, используйте 'category'

  • Чтобы выбрать типы данных Pandas datetimetz, используйте 'datetimetz'(новое в 0.20.0) или 'datetime64 [ns, tz]'

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