Мне нужно использовать разные функции для обработки числовых и строковых столбцов. То, что я делаю сейчас, действительно глупо:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
Есть ли более элегантный способ сделать это? Например
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
не dtypeОтветы:
Вы можете получить доступ к типу данных столбца с помощью
dtype
:источник
treat_numeric
функцию. Поскольку он включалagg.dtypes==np.float64
в качестве опции, я тоже.number
: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html Общее решениеis_numeric_dtype(agg[y])
В
pandas 0.20.2
это можно сделать:Итак, ваш код становится:
источник
pandas.core.common.is_numeric_dtype
существует с Pandas 0.13, и он делает то же самое, ноpandas.api.types.is_numeric_dtype
, я думаю , он устарел в пользуЯ знаю, что это немного старая тема, но с pandas 19.02 вы можете:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
источник
include[np.number]
(чтобы также включить целые числа и 32-битные числа с плавающей запятой) для первой строки иexclude[object]
для второй строки. Строки являются объектами в том, что касается типов. Фактически, включение строки с объектом дает мне ошибку.'period'
dtype пока растетNotImplementedError
(pandas 0.24.2). Так что может потребоваться ручная постобработка.Название задаваемого вопроса является общим, но авторы используют конкретный вариант использования, указанный в теле вопроса. Так что можно использовать любые другие ответы.
Но для того, чтобы полностью ответить на заглавный вопрос, следует уточнить, что, похоже, в некоторых случаях все подходы могут дать сбой и потребовать некоторой доработки. Я просмотрел все (и некоторые дополнительные) в порядке уменьшения надежности (на мой взгляд):
1. Сравнение типов напрямую через
==
(принятый ответ).Несмотря на то, что это принятый ответ и наибольшее количество положительных голосов, я думаю, что этот метод не следует использовать вообще. Потому что на самом деле этот подход не рекомендуется в Python, как упоминалось здесь несколько раз .
Но если один все еще хотите использовать его - должны быть осведомлены о некоторых панды специфических dtypes , как
pd.CategoricalDType
,pd.PeriodDtype
илиpd.IntervalDtype
. Здесь нужно использовать extratype( )
, чтобы правильно распознать dtype:Еще одно предостережение: необходимо точно указать тип:
2.
isinstance()
подход.Этот метод пока не упоминается в ответах.
Так что если прямое сравнение типов не очень хорошая идея - давайте попробуем для этого встроенную функцию python, а именно -
isinstance()
.Он терпит неудачу только в начале, потому что предполагает, что у нас есть некоторые объекты, но
pd.Series
илиpd.DataFrame
могут использоваться как просто пустые контейнеры с предопределенными,dtype
но без объектов в нем:Но если кто-то как-то преодолеет эту проблему и захочет получить доступ к каждому объекту, например, в первой строке, и проверит его dtype примерно так:
Это будет вводить в заблуждение в случае смешанного типа данных в одном столбце:
И последнее, но не менее важное - этот метод не может напрямую распознавать
Category
dtype. Как указано в документах :Так что этот метод тоже практически неприменим.
3.
df.dtype.kind
подход.Этот метод еще может работать с пустым
pd.Series
илиpd.DataFrames
имеет другие проблемы.Во-первых, он не может различать некоторые типы:
Во-вторых, что для меня на самом деле все еще неясно, это даже возвращается на некоторых типах dtypes None .
4.
df.select_dtypes
подход.Это почти то, что мы хотим. Этот метод разработан внутри pandas, поэтому он обрабатывает большинство угловых случаев, упомянутых ранее - пустые DataFrames, хорошо различаются dtypes numpy или pandas. Он хорошо работает с одиночным типом dtype
.select_dtypes('bool')
. Его можно использовать даже для выбора групп столбцов на основе dtype:Примерно так, как указано в документах :
Может показаться, что здесь мы видим первые неожиданные (бывшие для меня: вопрос ) результаты -
TimeDelta
включается в выводDataFrame
. Но , как ответил в наоборот это должно быть так, но один должен знать об этом. Обратите внимание , чтоbool
DTYPE пропускается, что может быть также нежелателен для кого - то, но это из - заbool
иnumber
в различных « поддеревьев » из Numpy dtypes. В случае с bool мы можем использоватьtest.select_dtypes(['bool'])
здесь.Следующее ограничение этого метода заключается в том, что для текущей версии pandas (0.24.2) этот код:
test.select_dtypes('period')
будет повышатьсяNotImplementedError
.И еще одно: отличить строки от других объектов невозможно:
Но это, во-первых, уже упоминалось в документации. И второе - проблема не в этом методе, а в способе хранения строк
DataFrame
. Но в любом случае это дело требует постобработки.5.
df.api.types.is_XXX_dtype
подход.Предполагается, что это самый надежный и собственный способ достижения распознавания dtype (путь к модулю, в котором находятся функции, говорит сам по себе), как я полагаю. И он работает почти идеально, но все же имеет как минимум одно предостережение и все же нужно как-то различать строковые столбцы .
Кроме того, это может быть субъективным, но этот подход также имеет более «понятную для
number
человека» групповую обработку dtypes по сравнению с.select_dtypes('number')
:Нет
timedelta
иbool
в комплекте. Отлично.Мой конвейер использует именно эту функциональность в данный момент плюс небольшую пост-ручную обработку.
Вывод.
Надеюсь, я смог аргументировать главное - что все обсуждаемые подходы могут быть использованы, но только
pd.DataFrame.select_dtypes()
иpd.api.types.is_XXX_dtype
должны действительно рассматриваться как применимые.источник
Если вы хотите пометить тип столбца фрейма данных как строку, вы можете сделать:
Пример:
Ответ для вашего кода:
источник
Чтобы красиво напечатать типы данных столбца
Чтобы проверить типы данных, например, после импорта из файла
Иллюстративный вывод:
источник