Как сделать первую строку заголовком pandas

Обновлено: 05.07.2024

В статье показано, как читать и писать CSV-файлы с помощью библиотеки Python Pandas. Для чтения CSV-файла используется метод read_csv() библиотеки Pandas. Для записи CSV-файла используется метод to_csv().

В то время как вы можете читать и писать CSV-файлы в Python с помощью встроенной функции open() или выделенного модуля csv , вы также можете использовать Pandas.

В этой статье вы увидите, как использовать библиотеку Python Pandas для чтения и записи CSV-файлов.

Что такое CSV-файл?

Давайте быстро рассмотрим, что такое CSV-файл – не более чем простой текстовый файл, следуя нескольким соглашениям по форматированию. Однако это самый распространенный, простой и лёгкий метод хранения табличных данных. Этот формат упорядочивает таблицы, следуя определенной структуре, разделенной на строки и столбцы. Именно эти строки и столбцы содержат ваши данные.

Символ новой строки завершает каждую строку с данными, чтобы начать следующую. Аналогично, разделитель, обычно запятая, разделяет столбцы внутри каждой строки.

Например, у нас может быть таблица, которая выглядит следующим образом:

Если бы мы преобразовали её в формат CSV, она выглядела бы следующим образом:

Хотя имя (Comma-Separated Values) изначально использует запятую в качестве разделителя, можно также использовать другие разделители, например точку с запятой (;). Каждая строка таблицы является новой строкой CSV-файла и очень компактным и лаконичным способом представления табличных данных.

Теперь давайте рассмотрим функцию read_csv() .

Чтение и запись CSV-файлов с помощью Pandas

Pandas – это очень мощный и популярный фреймворк для анализа и обработки данных. Одной из наиболее ярких особенностей Pandas является его способность читать и записывать различные типы файлов, включая CSV и Excel. Можно эффективно и легко манипулировать CSV-файлами в Pandas с помощью таких функций, как read_csv() и to_csv() .

Установка Pandas

Вам нужно установить Pandas, прежде чем использовать его. Давайте сделаем это с помощью pip :

Чтение CSV-файлов с помощью read_csv()

Давайте импортируем набор данных Titanic, который можно получить на GitHub :

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

Давайте взглянем на head() этого набора данных, чтобы убедиться, что он импортирован правильно:

Кроме того, вы также можете читать CSV-файлы из онлайн-ресурсов, таких как GitHub, просто передав URL-адрес ресурса функции read_csv() . Давайте прочитаем этот же CSV-файл из репозитория GitHub, не загружая его сначала на нашу локальную машину:

Это также приводит к:

Настройка заголовков

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

Давайте определим список имен столбцов и будем использовать их вместо имен из CSV-файла:

Давайте запустим этот код:

Хм, теперь у нас есть наши пользовательские заголовки, но первая строка CSV-файла, которая первоначально использовалась для установки имен столбцов, также включена в DataFrame . Давайте пропустим эту строку, так как она больше не имеет для нас никакого значения.

Пропуск строк при чтении CSV

Давайте решим эту проблему с помощью аргумента skiprows :

Теперь давайте запустим этот код:

Работает как по волшебству! Аргумент skiprows принимает список строк, которые вы хотите пропустить. Вы можете пропустить, например, 0, 4, 7 если хотите:

Это приведет к тому, что DataFrame не будет содержать некоторые строки, которые мы видели раньше:

Имейте в виду, что пропуск строк происходит до того как DataFrame полностью сформирован, поэтому не будет пропущено ни одного индекса самого DataFrame, хотя в этом случае можно увидеть, что в поле Id (импортированном из CSV-файла) отсутствуют идентификаторы 4 и 7.

Удаление Заголовков

Вы также можете решить полностью удалить заголовок, что приведет к DataFrame , который просто имеет 0. n столбцов заголовка, установив аргумент header в None :

Вы также можете захотеть удалить заголовок полностью, что приведет к тому что результирующий DataFrame будет содержать просто 0…n столбцов заголовка. Для этого нужно установить аргумент заголовка None :

Здесь лучше всего пропустить первую строку, так как в противном случае значения из первой строки будут фактически включены в первую строку:

Указание разделителей

Как уже упоминалось ранее, в конечном итоге вы, вероятно, столкнетесь с CSV-файлом, который на самом деле не использует запятые для разделения данных. В таких случаях можно использовать аргумент sep для указания других разделителей:

Запись CSV-файлов с помощью to_csv()

Опять же, DataFrame являются табличными. Превратить DataFrame в CSV – файл так же просто, как превратить CSV – файл в DataFrame – мы вызываем функцию write_csv() у экземпляра DataFrame .

При записи DataFrame в CSV-файл вы также можете изменить имена столбцов с помощью аргумента columns или указать разделитель с помощью аргумента sep . Если не указать ни один из них, в конечном итоге будет создан стандартный csv файл, с запятыми в качестве разделителя.

Давайте поиграем с этим:

Здесь мы сделали простой DataFrame с двумя городами и их соответствующими штатами. Затем мы сохранили эти данные в CSV-файл, используя to_csv() предоставив имя файла.

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

Хотя это не очень хорошо отформатировано. У нас все еще есть индексы из фрейма данных , который также ставит странное отсутствующее место перед именами столбцов. Если бы мы повторно импортировали этот CSV обратно в DataFrame , это был бы беспорядок:

Хотя, результат не очень хорошо отформатирован. У нас все еще есть индексы из DataFrame, а также странное пустое место перед именами столбцов. Если мы повторно импортируем этот CSV обратно в DataFrame, то получим беспорядок:

Индексы из DataFrame в итоге превратились в новый столбец, который теперь Unnamed.

При сохранении файла необходимо обязательно отбросить индекс DataFrame:

Это приводит к созданию файла, который содержит:

Работает как заклинание! Если повторно импортировать его и распечатать содержимое, DataFrame будет построен правильно:

Настройка заголовков

Давайте изменим заголовки столбцов по умолчанию:

Мы создали список new_header , который содержит различные значения для наших столбцов. Затем, используя аргумент header , мы установили их вместо исходных имен столбцов. Это создает файл cities.csv с таким содержимым:

Настройка разделителя

Давайте изменим разделитель со значения по умолчанию ( , ) на новый:

В результате получается файл cities.csv , содержащий:

Обработка пропущенных значений

Иногда DataFrame имеют пропущенные значения, которые мы оставили как NaN или NA . В таких случаях вы можете отформатировать их при записи в CSV-файл. Вы можете использовать аргумент na_rep и установить значение, которое будет помещено вместо пропущенного значения:

Здесь у нас есть две действительные пары город-штат, но Вашингтон, округ Колумбия отсутствует его штат. Если мы запустим этот код, то получим файл cities.csv со следующим содержимым:

Здесь у нас есть две валидные пары город-штат, но у города Вашингтон округ Колумбия отсутствует штат. Если мы запустим этот код, он приведет к cities.csv со следующим содержимым:

Заключение

В статье показано, как читать и писать CSV-файлы с помощью Python библиотеки Pandas. Для чтения CSV-файла используется метод read_csv() . Можно также передавать пользовательские имена заголовков при чтении CSV-файлов через атрибут names метода read_csv() . Наконец, для записи CSV-файла с помощью Pandas сначала необходимо создать объект Pandas DataFrame, а затем вызвать метод to_csv() у DataFrame.


Абстракция датафрейма является одной из наиболее полезных концепций в современной экосистеме управления данными. Вращается она главным образом вокруг табличных структур, которые имеют повышенную производительность при обновлении и запросе данных различными способами. Сериализация/десериализация этих структур из/в различные форматы файлов упрощает работу с данными. Более того, возможность производить различные SQL-подобные операции, такие как объединение, наряду с выполнением математических вычислений в самом датафрейме существенно расширяет возможности программиста.

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

Есть два способа конкатенировать датафрейм A и B . Представьте их как проиндексированные таблицы. Эти две таблицы можно объединить либо по оси y, либо по оси x.

Если требуется конкатенировать их вдоль x, то вызов API будет таким:

Если же вдоль y, то таким:

Применение

Предположим, у вас есть большое количество CSV-файлов или XLSX-данных, которые нужно присоединить друг к другу. Одним из способов сделать это будет считать данные файлов в датафреймы и использовать инструкцию pd.concat([file_1, file_2]) . Программно можно перебрать имена файлов (используя модуль glob для чтения набора имен файлов с помощью техники сопоставления шаблонов, например regex), считать их в датафрейм, соединить в памяти и сериализовать конкатенированные датафреймы в нужный формат файлов.

Вариант с axis = 0 используется нечасто, но его можно применять в сценариях, когда нужно обработать массивы данных, собранных с упорядочиванием. То есть, когда последовательность данных соответствует последовательности других массивов данных. В таком случае эти массивы можно объединить вдоль оси x, получив более объемное и значительное представление в табличном формате. Затем к полученной структуре можно применять операции, использующие все типы данных в ее столбцах.

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

Просмотр сведений

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

Исключение столбцов

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

Удаление датафреймов друг из друга

Представим, что у нас есть датафрейм X , состоящий из столбцов [A, B, C, D] , и датафрейм Y , состоящий из подмножества столбцов X . Нам нужно удалить Y из X . Это можно сделать так:

Конкатенация этих датафреймов приведет к дублированию общих записей, которые в итоге будут удалены выражением keep = false функции drop_duplicates() .

Применение

Предположим, что столбец A — это определенный вид ID сведений о работнике. К примеру, датафрейм X состоит из всех данных о работниках, а датафрейм Y содержит данные (с той же структурой) о работниках, не разбирающихся в Python. Нам нужно отфильтровать сведения о сотрудниках, которые не знакомы с Python.

Определение дельты записей на основе столбца

Представим, что у нас есть датафрейм X , состоящий из столбцов [A, B, C, D] , а также датафрейм Y , состоящий из тех же столбцов. При этом некоторые элементы столбцов A этих датафреймов являются общими. Нам нужно получить из датафрейма X строки, которые не содержат значения из столбца A , находящиеся в столбце A датафрейма Y .

Применение

Взгляните на эту таблицу:


Эти пары могли быть сгенерированы, например, из двух журналов: старого и нового. Нам нужно найти пары ID, принадлежащие одному и тому же человеку. Предположим, что ваш отдел кадров неожиданно заявляет, что определенный список ( hr_list ) сотрудников с ID_1 больше в компании не работает. Как удалить их из этого датафрейма?

Разделение на основе значений столбцов

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

Это простейший пример.

Это эффективный способ определения количества различных элементов в столбце.


Ответ на приведенный выше запрос можно получить следующим подходом:

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

Более того, можно считывать большие файлы в отдельные фрагменты и маршалировать их в датафреймы.

Таким образом одновременно в памяти удерживается только фрагмент размером chunksize .

Бывают случаи, в которых требуется внести изменения в конкретные столбцы детафрейма. К примеру, в датафрейме X , содержащем столбцы A , B и C , мы можем применить функцию f() к значениям столбца B , чтобы сохранить их в столбце D .

Эта операция окажется намного быстрее, чем перебор всего датафрейма с помощью iterrows() .

Есть и альтернативный метод. Его можно использовать, когда функцию f() требуется применить только к одному столбцу.

По аналогии с реляционными базами данных датафреймы можно объединять merge , используя разрешающий столбец.

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

Переименовывать столбцы особенно полезно перед сериализацией файла или перед внедрением стороннего хранилища данных.

Pandas — очень мощный инструмент для работы и манипуляций над данными с помощью python. Можно сказать, что pandas предоставляет возможности SQL базы данных, дополненные мощью python. Однако, работа с данной библиотекой иногда вызывает некоторые трудности, так как работать приходится по сути с матричными данными и объектами pandas да numpy, а переход к стандартным python типам и циклам неминуемо грозит кратной потерей функциональности. Поэтому для себя создал шпаргалку по работе с дата-фреймами:

Работа начинается с загрузки данных в DataFrame, поэтому для начала считаем данные:

Возможно и самостоятельно создать DataFrame и добавить строки

После создания или загрузки DF полезно посмотреть чтоже там за данные, для этого можно воспользоваться следующими операциями:

Возможно далее вам захочется получить точечное значение по координатам из дата фрема, тогда используйте ix

Для фильтрации по колонкам пандас использует булевую логику, проще показать на примере:

Далее приведём несколько примеров манипуляции с данными:

Применение произвольной функции ко всей колонке

Переименование колонки, сортировка

пример на соединение или конкатенацию дата-фреймов

группировка в дата-фрейме без мультииндекса

После всех манипуляций, вас скорее всего надо будет данные куда-то выгрузить в другом формате или сохранить до следующего раза новый фрагмент таблицы дата-фрейма:

Запись опубликована 09.04.2018 автором zab88 в рубрике Без рубрики с метками DataFrame, pandas, python.

Фрейм данных – это двухмерный набор данных, структура, в которой данные хранятся в табличной форме. Наборы данных упорядочены по строкам и столбцам; мы можем хранить несколько наборов данных во фрейме данных. Мы можем выполнять различные арифметические операции, такие как добавление выбора столбца или строки и столбцов или строк во фрейме данных.

Мы можем импортировать DataFrames из внешнего хранилища; эти хранилища могут быть базой данных SQL, файлом CSV или файлом Excel. Мы также можем использовать списки, словарь, список словаря и т. д.

В этом руководстве мы научимся создавать фрейм данных несколькими способами. Давайте разберемся как создать DataFrames Pandas в Python. Во-первых, нам нужно установить библиотеку pandas в среду Python.

Пустой фрейм данных

Мы можем создать базовый пустой фрейм данных. Для создания DataFrame необходимо вызвать конструктор фрейма данных.

Метод – 2: создать фрейм данных с помощью списка

Мы можем создать фрейм данных, используя простой список или список списков. Давайте разберемся в следующем примере.

Метод – 3: Dataframe из dict ndarray / lists

Dict ndarray / lists можно использовать для создания фрейма данных, все ndarray должны иметь одинаковую длину. По умолчанию индекс будет диапазоном(n); где n обозначает длину массива.

Метод – 4: Создание фрейма данных индексов с использованием массивов

Давайте разберемся в примере создания фрейм данных индексов с использованием массивов.

В приведенном выше коде мы определили имя столбца с различными названиями автомобилей и их рейтингами. Мы использовали массив для создания индексов.

Метод – 5: Dataframe из списка dicts

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

Давайте разберемся в другом примере создания фрейма данных pandas из списка словарей с индексом строки и индексом столбца.

Рассмотрим пример создания фрейма данных путем передачи списков словарей и строк.

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

Метод – 6: с помощью функции zip()

Функция zip() используется для объединения двух списков. Давайте разберемся в следующем примере.

Метод – 7: из Dicts серии

Словарь можно передать для создания фрейма данных. Мы можем использовать Dicts of series, где последующий индекс представляет собой объединение всех серий переданного значения индекса. Давайте разберем на примере.

Pandas - это библиотека с открытым исходным кодом, лицензированная BSD, предоставляющая высокопроизводительные, простые в использовании структуры данных и инструменты анализа данных для языка программирования Python.

Структуры данных, предоставляемые Pandas, бывают двух разных типов.

Мы посмотрим вПанды DataFrameв этом посте.

Общая тенденция в изучении панд (включая официальную документацию) заключается вПанды сериисначала следуетПанды DataFrame, Тем не менее, после значительного использования панд, я убежден, что мы должны начать сПанды DataFrame, Концепция и обоснованиеПанды сериистановится понятным и понятным, как только мы освоимсяПанды DataFrame.

Что такое датафрейм?

Вот какТехническое определениевыглядит как

Панды DataFrameявляется двумерной помеченной структурой данных со столбцами потенциально другого типа.

И вот как вы должны это понимать

Панды DataFrameне что иное, как представление в памяти листа Excel с помощью языка программирования Python

Так,Панды DataFrameпохож на лист Excel и выглядит так


Так же, как Excel,Панды DataFrameпредоставляет различные функции для анализа, изменения и извлечения ценной информации из данного набора данных.

Как создать Pandas DataFrame?

В реальном миреPanda DataFrameбудет создан путем загрузки наборов данных из постоянного хранилища, включая, помимо прочего, базы данных excel, csv и MySQL.

Однако, чтобы помочь вам лучше понять это, я буду использовать Python Data Structures (словарь и список) здесь.

Мы можем создатьПанды DataFrameиз этого словаря как

Результирующий DataFrame должен выглядеть аналогично тому, что мы видели на листе Excel выше, как


Есть вероятность того, что столбцы не в последовательности, как определено в словаре, потому что Python реализует словарь как хэш и не гарантирует сохранение последовательности.

Индекс строки →

С тех пор мы не предоставили значения индекса строкиDataFrame, он автоматически генерирует последовательность (0… 6) в качестве индекса строки.

Чтобы предоставить собственный индекс строки, нам нужно передать index параметр в DataFrame(. ) функционировать как

Индекс не обязательно должен быть числовым все время, мы также можем передавать строки как индекс. Например

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

Столбцы панд DataFrame

В отличие от списков Python или словарей и так же, какNumPyКолоннаDataFrameвсегда будет одного типа.

Мы можем проверить тип данных столбца, используя словарь, такой как синтаксис, или добавив имя столбца, используя DataFrame. .

Если мы хотим проверить типы данных всех столбцов внутриDataFrame,мы будем использовать dtypes функцияDataFrameкак

Тип всех столбцов будет отображаться как


Просмотр данных фрейма данных

В любой момент времениПанды DataFrameбудет содержать сотни (если не тысячи) строк данных. Мы можем только просматривать их выборочно в любой момент времени.

Для выборочного просмотра строк мы можем использоватьголова (…) и хвост (…)функции, которые по умолчанию дают первые или последние пять строк (если ввод не предоставлен), в противном случае показывает определенное количество строк сверху или снизу

Читайте также: