Как посмотреть типы данных в pandas
Перейти к содержимому

Как посмотреть типы данных в pandas

Получение типов данных столбцов в DataFrame Pandas

Чтобы получить типы данных столбцов в Pandas DataFrame, вызовите свойство dtypes, которое возвращает объект типа pandas.Series с типами данных каждого столбца в нем.

Синтаксис для использования свойства dtypes:

В следующей программе мы создали DataFrame с определенными данными и именами столбцов. Давайте получим типы данных столбцов с помощью DataFrame.dtypes.

Мы можем распечатать элементы возвращаемого значения DataFrame.dtypes, используя цикл for, как показано ниже.

В этом руководстве на примерах Python мы узнали, как получить типы данных столбца в DataFrame с помощью свойства dtypes.

how to check the dtype of a column in python pandas

I need to use different functions to treat numeric columns and string columns. What I am doing now is really dumb:

Is there a more elegant way to do this? E.g.

user avatar

6 Answers 6

You can access the data-type of a column with dtype :

user avatar

user avatar

In pandas 0.20.2 you can do:

So your code becomes:

user avatar

I know this is a bit of an old thread but with pandas 19.02, you can do:

Asked question title is general, but authors use case stated in the body of the question is specific. So any other answers may be used.

But in order to fully answer the title question it should be clarified that it seems like all of the approaches may fail in some cases and require some rework. I reviewed all of them (and some additional) in decreasing of reliability order (in my opinion):

1. Comparing types directly via == (accepted answer).

Despite the fact that this is accepted answer and has most upvotes count, I think this method should not be used at all. Because in fact this approach is discouraged in python as mentioned several times here.
But if one still want to use it — should be aware of some pandas-specific dtypes like pd.CategoricalDType , pd.PeriodDtype , or pd.IntervalDtype . Here one have to use extra type( ) in order to recognize dtype correctly:

Another caveat here is that type should be pointed out precisely:

2. isinstance() approach.

This method has not been mentioned in answers so far.

So if direct comparing of types is not a good idea — lets try built-in python function for this purpose, namely — isinstance() .
It fails just in the beginning, because assumes that we have some objects, but pd.Series or pd.DataFrame may be used as just empty containers with predefined dtype but no objects in it:

But if one somehow overcome this issue, and wants to access each object, for example, in the first row and checks its dtype like something like that:

It will be misleading in the case of mixed type of data in single column:

And last but not least — this method cannot directly recognize Category dtype. As stated in docs:

Returning a single item from categorical data will also return the value, not a categorical of length “1”.

So this method is also almost inapplicable.

3. df.dtype.kind approach.

This method yet may work with empty pd.Series or pd.DataFrames but has another problems.

First — it is unable to differ some dtypes:

Second, what is actually still unclear for me, it even returns on some dtypes None.

4. df.select_dtypes approach.

This is almost what we want. This method designed inside pandas so it handles most corner cases mentioned earlier — empty DataFrames, differs numpy or pandas-specific dtypes well. It works well with single dtype like .select_dtypes(‘bool’) . It may be used even for selecting groups of columns based on dtype:

Like so, as stated in the docs:

On may think that here we see first unexpected (at used to be for me: question) results — TimeDelta is included into output DataFrame . But as answered in contrary it should be so, but one have to be aware of it. Note that bool dtype is skipped, that may be also undesired for someone, but it’s due to bool and number are in different «subtrees» of numpy dtypes. In case with bool, we may use test.select_dtypes([‘bool’]) here.

Next restriction of this method is that for current version of pandas (0.24.2), this code: test.select_dtypes(‘period’) will raise NotImplementedError .

And another thing is that it’s unable to differ strings from other objects:

But this is, first — already mentioned in the docs. And second — is not the problem of this method, rather the way strings are stored in DataFrame . But anyway this case have to have some post processing.

5. df.api.types.is_XXX_dtype approach.

This one is intended to be most robust and native way to achieve dtype recognition (path of the module where functions resides says by itself) as i suppose. And it works almost perfectly, but still have at least one caveat and still have to somehow distinguish string columns.

Besides, this may be subjective, but this approach also has more ‘human-understandable’ number dtypes group processing comparing with .select_dtypes(‘number’) :

No timedelta and bool is included. Perfect.

My pipeline exploits exactly this functionality at this moment of time, plus a bit of post hand processing.

read_csv

10 трюков библиотеки Python Pandas, которые вам нужны

Все знают эту команду. Но когда данные, которые вы пытаетесь обработать, большие, попробуйте добавить аргумент nrows = 5, чтобы прочитать только крошечную часть таблицы перед фактической загрузкой всей таблицы. Зачем? Так удастся избежать ошибки с выбором неправильного разделителя, ведь это не всегда запятая.

Или используйте head в Linux, чтобы вывести первые, скажем, 5 строк из любого текстового файла: head –n 5 data.txt.

Извлеките список столбцов с df.columns.tolist() . Добавьте аргумент usecols = [‘c1’, ‘c2’,…], чтобы загрузить только необходимые столбцы. Кроме того, если знаете типы данных нескольких конкретных столбцов, добавьте аргумент dtype = . Так загрузка будет быстрее. Этот аргумент даёт ещё одно преимущество. Если один столбец содержит строки и числа, рекомендуется объявить его тип строковым. Так вы избежите ошибок при объединении таблиц, когда используете этот столбец как ключ.

select_dtypes

Если нужна предварительная обработка данных на языке Python, то эта команда сэкономит вам время. После чтения из таблицы типами данных по умолчанию для каждого столбца будут bool, int64, float64, object, category, timedelta64 или datetime64. Можете сначала проверить распределение с помощью

чтобы узнать все типы данных объекта DataFrame. Далее выполните

df.select_dtypes(include = [‘float64’, ‘int64’])

чтобы выбрать подмножество объекта DataFrame только с числовыми характеристиками.

copy

Это важная команда, если ещё не слышали о ней. Когда выполните следующие операции

обнаружите, что df1 изменён. Это потому, что df2 = df1 не делает копию df1 и не присваивает это значение df2, а устанавливает указатель, который ссылается на df1. Таким образом, любые изменения в df2 приведут к изменениям в df1. Чтобы это исправить, сделайте

map

Это классная команда для простого преобразования данных. Определяете словарь, в котором «ключами» являются старые значения, а «значениями» – новые значения:

  • трансформация true, false в 1, 0 для моделирования;
  • определение уровней;
  • установленные пользователем кодировки.

применять или не применять функцию apply?

10 трюков библиотеки Python Pandas, которые вам нужны

Нужен новый столбец с несколькими другими столбцами в качестве входных данных? Функция apply спешит на помощь!

Здесь определена функцию с двумя входными переменными, и с помощью функции apply применяем к столбцам ‘c1’ и ‘c2’.

Но проблема применения «apply» в том, что иногда это слишком медленно. Например, вам надо рассчитать максимум для ‘c1’ и ‘c2’. Конечно, можно сделать

но это будет намного медленнее, чем

Вывод: не используйте apply, если можете выполнить ту же работу с помощью других встроенных функций, которые часто работают быстрее. Например, если нужно округлить столбец ‘c’ до целых чисел, выполните round(df[‘c’], 0) или df[‘c’].round(0) вместо apply: df.apply(lambda x: round(x[‘c’], 0), axis = 1) .

value counts

Команда для проверки распределения значений. Чтобы проверить возможные значения и частоту каждого отдельного значения в столбце ‘c’, выполните:

Некоторые полезные трюки и аргументы этой функции:

  1. normalize = True – проверить частоту вместо подсчёта.
  2. dropna = False – включить пропущенные значения в статистику.
  3. df[‘c’].value_counts().reset_index() – преобразовать таблицу статистики в объект Pandas DataFrame.
  4. df[‘c’].value_counts().reset_index().sort_values(by=’index’) – показывать статистику, отсортированную по уникальным значениям в столбце ‘c’ вместо количества.

Количество пропущенных значений

При построении моделей часто надо исключить строку с большим количеством пропущенных значений или строки со всеми пропущенными значениями. Используйте .isnull() и .sum() для подсчёта количества пропущенных значений в указанных столбцах:

Выбрать строки с конкретными идентификаторами

В SQL используем SELECT * FROM… WHERE ID в («A001», «C022»,…) и получаем записи с конкретными идентификаторами. Если хотите сделать то же с помощью Python библиотеки Pandas, используйте

Процентильные группы в Python Pandas

У нас есть числовой столбец. Хотим классифицировать значения в этом столбце по группам:

  • верхние 5% в группе 1
  • 5–20% в группе 2
  • 20–50% в группе 3
  • нижние 50% в группе 4

Конечно, можно сделать это с помощью pandas.cut, но рассмотрим другой вариант

который быстро запускается, потому что не применяется функция apply.

to_csv

Опять же, это команда, которую все будут использовать. Здесь расскажем о двух трюках. Первый:

Используйте эту команду для вывода первых пяти строк того, что будет в точности записано в файл.

Ещё один трюк касается смешения целых чисел и пропущенных значений. Если столбец содержит как пропущенные значения, так и целые числа, типом данных по-прежнему будет float, а не int. Когда экспортируете таблицу, добавьте float_format = ‘%. 0f’, чтобы округлить числа с плавающей точкой до целых чисел. Используйте этот трюк, когда нужны только целочисленные выходные данные столбцов – так избавитесь от надоедливых ‘.0’.

Это перевод статьи о трюках библиотеки Python Pandas на Towards Data Science.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *