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


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.