как узнать тип данных в pandas

Как проверить тип столбца в пандах Python

Мне нужно использовать разные функции для обработки числовых столбцов и строковых столбцов. То, что я делаю сейчас, действительно глупо:

Есть ли более элегантный способ сделать это? Например.

6 ответов

Вы можете получить доступ к типу данных столбца с помощью dtype :

Я знаю, что это немного старая тема, но с пандами 19.02 вы можете сделать:

Если вы хотите пометить тип столбца данных как строку, вы можете сделать:

Ответ для вашего кода:

Чтобы красиво печатать типы данных столбца

Чтобы проверить типы данных после, например, импорта из файла

В pandas 0.20.2 вы можете сделать:

Итак, ваш код становится:

Заголовок задаваемого вопроса носит общий характер, но авторы используют прецедент, указанный в основной части вопроса. Так что любые другие ответы могут быть использованы.

Но для того, чтобы полностью ответить на заглавный вопрос , необходимо уточнить, что кажется, что все подходы могут провалиться в некоторых случаях и требуют некоторых переделок. Я рассмотрел все из них (и некоторые дополнительные) в порядке уменьшения надежности (на мой взгляд):

1. Сравнение типов напрямую через == (принятый ответ).

Еще одна оговорка: этот тип должен быть точно указан:

2. isinstance() подход.

Этот метод не был упомянут в ответах до сих пор.

Но если кто-то как-то преодолеет эту проблему и захочет получить доступ к каждому объекту, например, в первой строке, и проверит его dtype следующим образом:

Это будет вводить в заблуждение в случае смешанного типа данных в одном столбце:

Возвращение одного элемента из категориальных данных также возвращает значение, а не категориальное с длиной «1».

Так что этот метод также практически неприменим.

3. df.dtype.kind подход.

Во-вторых, что для меня все еще неясно, он даже возвращает некоторые dtypes None.

4. df.select_dtypes подход.

Примерно так же, как указано в документах :

И еще одна вещь: он не может отличать строки от других объектов:

5. df.api.types.is_XXX_dtype подход.

Предполагается, что этот способ является наиболее надежным и естественным способом достижения распознавания dtype (путь модуля, в котором находятся функции, говорит сам за себя), как я полагаю. И это работает почти идеально, но по-прежнему есть хотя бы одна оговорка и все равно придется каким-то образом различать строковые столбцы.

Нет timedelta и bool включены. Отлично.

В данный момент мой конвейер использует именно эту функциональность, а также немного пост-ручной обработки.

Источник

Руководство по использованию pandas для анализа больших наборов данных

При использовании библиотеки pandas для анализа маленьких наборов данных, размер которых не превышает 100 мегабайт, производительность редко становится проблемой. Но когда речь идёт об исследовании наборов данных, размеры которых могут достигать нескольких гигабайт, проблемы с производительностью могут приводить к значительному увеличению длительности анализа данных и даже могут становиться причиной невозможности проведения анализа из-за нехватки памяти.

Читайте также:  план бани 4х5 5

В то время как инструменты наподобие Spark могут эффективно обрабатывать большие наборы данных (от сотен гигабайт до нескольких терабайт), для того чтобы полноценно пользоваться их возможностями обычно нужно достаточно мощное и дорогое аппаратное обеспечение. И, в сравнении с pandas, они не отличаются богатыми наборами средств для качественного проведения очистки, исследования и анализа данных. Для наборов данных средних размеров лучше всего попытаться более эффективно использовать pandas, а не переходить на другие инструменты.

Работа с данными о бейсбольных матчах

Мы будем работать с данными по бейсбольным играм Главной лиги, собранными за 130 лет и взятыми с Retrosheet.

Изначально эти данные были представлены в виде 127 CSV-файлов, но мы объединили их в один набор данных с помощью csvkit и добавили, в качестве первой строки получившейся таблицы, строку с названиями столбцов. Если хотите, можете загрузить нашу версию этих данных и экспериментировать с ними, читая статью.

Ниже приведены сведения о наиболее важных столбцах таблицы с этими данными. Если вы хотите почитать пояснения по всем столбцам — здесь вы можете найти словарь данных для всего набора данных.

Вот какие сведения нам удалось получить:

Как оказалось, у нас имеется 171,907 строк и 161 столбец. Библиотека pandas автоматически выяснила типы данных. Здесь присутствует 83 столбца с числовыми данными и 78 столбцов с объектами. Объектные столбцы используются для хранения строковых данных, и в тех случаях, когда столбец содержит данные разных типов.

Внутреннее представление объекта DataFrame

Внутреннее представление данных разных типов в pandas

Так как данные разных типов хранятся раздельно, мы исследуем использование памяти разными типами данных. Начнём со среднего показателя использования памяти по разным типам данных.

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

Эти сведения дают нам понять то, что большая часть памяти уходит на 78 столбцов, хранящих объектные значения. Мы ещё поговорим об этом позже, а сейчас давайте подумаем о том, можем ли мы улучшить использование памяти столбцами, хранящими числовые данные.

Подтипы

Как мы уже говорили, pandas представляет числовые значения в виде структур данных ndarray NumPy и хранит их в непрерывных блоках памяти. Эта модель хранения данных позволяет экономно расходовать память и быстро получать доступ к значениям. Так как pandas представляет каждое значение одного и того же типа, используя одинаковое число байт, и структуры ndarray хранят сведения о числе значений, pandas может быстро и точно выдать сведения об объёме памяти, потребляемых столбцами, хранящими числовые значения.

Читайте также:  лайф коуч что это такое

Выполнив этот код, мы получаем следующие данные:

Тут можно обратить внимание на различие между типами uint (беззнаковое целое) и int (целое число со знаком). Оба типа имеют одинаковую ёмкость, но, при хранении в столбцах только положительных значений, беззнаковые типы позволяют эффективнее расходовать память.

Оптимизация хранения числовых данных с использованием подтипов

Вот что получается в результате исследования потребления памяти:

Сделаем то же самое со столбцами, содержащими числа с плавающей точкой.

В результате получается следующее:

Вот что у нас получилось:

Прежде чем мы займёмся такой оптимизацией, поближе познакомимся с тем, как в pandas хранятся строки, и сравним это с тем, как здесь хранятся числа.

Сравнение механизмов хранения чисел и строк

Тип object представляет значения с использованием строковых объектов Python. Отчасти это так от того, что NumPy не поддерживает представление отсутствующих строковых значений. Так как Python — это высокоуровневый интерпретируемый язык, он не даёт программисту инструментов для тонкого управления тем, как данные хранятся в памяти.

Это ограничение ведёт к тому, что строки хранятся не в непрерывных фрагментах памяти, их представление в памяти фрагментировано. Это ведёт к увеличению потребления памяти и к замедлению скорости работы со строковыми значениями. Каждый элемент в столбце, хранящем объектный тип данных, на самом деле, представляет собой указатель, который содержит «адрес», по которому настоящее значение расположено в памяти.

Ниже показана схема, созданная на основе этого материала, на которой сравнивается хранение числовых данных с использованием типов данных NumPy и хранение строк с применением встроенных типов данных Python.

Хранение числовых и строковых данных

Итак, сначала исследуем обычные строки:

Здесь данные по использованию памяти выглядят так:

Теперь посмотрим на то, как выглядит использование строк в объекте Series :

Здесь мы получаем следующее:

Тут можно видеть, что размеры строк, хранящихся в объектах Series pandas, аналогичны их размерам при работе с ними в Python и при представлении их в виде самостоятельных сущностей.

Оптимизация хранения данных объектных типов с использованием категориальных переменных

Исходные данные и категориальные данные, использующие подтип int8

Для того чтобы понять, где именно мы сможем воспользоваться категориальными данными для снижения потребления памяти, выясним количество уникальных значений в столбцах, хранящих значения объектных типов:

Вот что у нас получилось:

Как видите, хотя тип столбца изменился, данные, хранящиеся в нём, выглядят так же, как и раньше. Посмотрим теперь на то, что происходит внутри программы.

В следующем коде мы используем атрибут Series.cat.codes для того, чтобы выяснить то, какие целочисленные значения тип category использует для представления каждого из дней недели:

Читайте также:  прожектор для ремонта квартиры

Нам удаётся выяснить следующее:

Вот что тут получается:

Как видно, сначала потреблялось 9.84 мегабайт памяти, а после оптимизации — лишь 0.16 мегабайт, что означает 98% улучшение этого показателя. Обратите внимание на то, что работа с этим столбцом, вероятно, демонстрирует один из наиболее выгодных сценариев оптимизации, когда в столбце, содержащем примерно 172000 элементов, используется лишь 7 уникальных значений.

Хотя идея преобразования всех столбцов к этому типу данных выглядит привлекательно, прежде чем это делать, стоит учитывать негативные побочные эффекты такого преобразования. Так, наиболее серьёзный минус этого преобразования заключается в невозможности выполнения арифметических операций над категориальными данными. Это касается и обычных арифметических операций, и использования методов наподобие Series.min() и Series.max() без предварительного преобразования данных к настоящему числовому типу.

Теперь сравним то, что получилось после оптимизации, с тем, что было раньше:

Вот что у нас получилось:

В плане использования памяти здесь получается следующее:

Вот сводка по данным:

В результате получается следующее:

Данные теперь выглядят так:

Выбор типов при загрузке данных

К счастью, оптимальные типы данных для отдельных столбцов можно указать ещё до фактической загрузки данных. Функция pandas.read_csv() имеет несколько параметров, позволяющих это сделать. Так, параметр dtype принимает словарь, в котором присутствуют, в виде ключей, строковые имена столбцов, и в виде значений — типы NumPy.

Для того чтобы воспользоваться этой методикой, мы сохраним итоговые типы всех столбцов в словаре с ключами, представленными именами столбцов. Но для начала уберём столбец с датой проведения игры, так как его нужно обрабатывать отдельно.

Теперь мы сможем воспользоваться этим словарём вместе с несколькими параметрами, касающимися данных о датах проведения игр, в ходе загрузки данных.

Соответствующий код получается довольно-таки компактным:

В результате объём использования памяти выглядит так:

Данные теперь выглядят так, как показано на листе Фрагмент оптимизированного набора данных в этой таблице.

Анализ бейсбольных матчей

Теперь, после того, как мы оптимизировали данные, мы можем заняться их анализом. Взглянем на распределение игровых дней.

Дни, в которые проводились игры

Как видно, до 1920-х годов игры редко проводились по воскресеньям, после чего, примерно в течение 50 лет, игры в этот день постепенно проводились всё чаще.

Кроме того, можно заметить, что распределение дней недели, в которые проводились игры последние 50 лет, является практически неизменным.

Теперь взглянем на то, как со временем менялась длительность игр.

Возникает такое ощущение, что с 1940-х годов по настоящее время матчи становятся всё более длительными.

Итоги

Уважаемые читатели! Перевести эту статью нам порекомендовал наш читатель eugene_bb. Если вам известны какие-нибудь интересные материалы, которые стоит перевести — расскажите нам о них.

Источник

Образовательный портал