Як знайти числові стовпці в Пандах?


121

Скажімо, dfце панди DataFrame. Я хотів би знайти всі стовпці числового типу. Щось на зразок:

isNumeric = is_numeric(df)

Ви повинні вказати, чи dtypeвважається стовпець, який є object, але всі елементи чисельними, чисельними чи ні. Якщо ні, то візьміть відповідь Ханана, оскільки це також швидше. Інакше візьміть мою.
FooBar

Що станеться, якщо просто спробувати стовпці df.describe (). Потім призначте його змінній.
холодний

Відповіді:


146

Ви можете використовувати select_dtypesметод DataFrame. Він включає два параметри включають і виключають. Так isNumeric виглядатиме так:

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

newdf = df.select_dtypes(include=numerics)

94
Ви можете використовувати df.select_dtypes (include = [np.number]), якщо вам не потрібно вказувати список '
числових даних

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

76

Ви можете використовувати недокументовану функцію _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
Супер зручно; це десь задокументовано? Стурбований тим, що він зникає у майбутніх версіях та / або нестабільності, оскільки його префікс підкреслює, що він має бути приватним.
ійосеф

3
Ні, це ніде не зафіксовано. Однак тут є реалізація , як і згадується @ijoseph, я б насторожено використовував методи, які починаються з підкреслення, оскільки вони трохи більше, ніж деталі щодо впровадження. Використовуйте буквально БУДЬ-яку іншу відповідь, крім цього.
cs95

Саме так. Як найкраща практика, я намагаюся використовувати та перетворювати на якомога більше методів нумету. Це пов’язано з динамізмом панди. 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

Якщо у ваших стовпцях є числові дані, але вони також відсутні, то типом може бути "об'єкт". Це примусить стовпці до числових цифр:df.fillna(value=0, inplace=True)
vaughnkoch

26
df.select_dtypes(exclude=['object'])

7
Стовпці datetime є різного типу, але datetimeце не числові типи
Jeru Luke


6

Наступні коди повернуть список імен числових стовпців набору даних.

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

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

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

Дякую


4

Це ще один простий код для знаходження числового стовпця в кадрі даних панди,

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)перевіряє, чи всі значення в стовпці є "Істинним" і повертає ряд булевих символів, які можна використовувати для індексації потрібних стовпців.


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. друге, якщо оператор використовується для перевірки значень рядків, на які посилається об'єкт.


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.