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

Хотя вы можете читать и писать файлы CSV в Python, используя встроенную функцию open () или специальный модуль csv [https://docs.python.org/3/library/csv.html], вы также можете использовать Pandas . В этой статье вы увидите, как использовать библиотеку Python Pandas [https://pandas.pydata.org/] для чтения и записи файлов CSV. Что такое файл CSV? Давайте быстро напомним, что такое файл CSV - не что иное, как простой текстовый файл с соблюдением нескольких соглашений о форматировании. Однако это наиболее распространенный, простой и легкий

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

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

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

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

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

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

 | City | State | Capital | Population | 
 | ------------ | ------------ | ------- | ------------- | 
 | Philadelphia | Pennsylvania | No | 1.581 Million | 
 | Sacramento | California | Yes | 0.5 Million | 
 | New York | New York | No | 8.623 Million | 
 | Austin | Texas | Yes | 0.95 Million | 
 | Miami | Florida | No | 0.463 Million | 

Если бы мы преобразовали его в формат CSV, это выглядело бы так:

 City,State,Capital,Population 
 Philadelphia,Pennsylvania,No,1.581 Million 
 Sacramento,California,Yes,0.5 Million 
 New York,New York,No,8.623 Million 
 Austin,Texas,Yes,0.95 Million 
 Miami,Florida,No,0.463 Million 

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

Теперь давайте посмотрим на read_csv() .

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

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

Установка Pandas

Мы должны установить Pandas перед его использованием. Давайте использовать pip :

 $ pip install pandas 

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

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

 import pandas as pd 
 titanic_data = pd.read_csv('titanic.csv') 

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

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

 titanic_data.head() 

Это приводит к:

 PassengerId Survived Pclass ... Fare Cabin Embarked 
 0 1 0 3 ... 7.2500 NaN S 
 1 2 1 1 ... 71.2833 C85 C 
 2 3 1 3 ... 7.9250 NaN S 
 3 4 1 1 ... 53.1000 C123 S 
 4 5 0 3 ... 8.0500 NaN S 

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

 import pandas as pd 
 
 titanic_data = pd.read_csv(r'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv') 
 print(titanic_data.head()) 

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

 PassengerId Survived Pclass ... Fare Cabin Embarked 
 0 1 0 3 ... 7.2500 NaN S 
 1 2 1 1 ... 71.2833 C85 C 
 2 3 1 3 ... 7.9250 NaN S 
 3 4 1 1 ... 53.1000 C123 S 
 4 5 0 3 ... 8.0500 NaN S 
 
 [5 rows x 12 columns] 

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

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

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

 import pandas as pd 
 
 col_names = ['Id', 
 'Survived', 
 'Passenger Class', 
 'Full Name', 
 'Gender', 
 'Age', 
 'SibSp', 
 'Parch', 
 'Ticket Number', 
 'Price', 'Cabin', 
 'Station'] 
 
 titanic_data = pd.read_csv(r'E:\Datasets\titanic.csv', names=col_names) 
 print(titanic_data.head()) 

Запустим этот код:

 Id Survived Passenger Class ... Price Cabin Station 
 0 PassengerId Survived Pclass ... Fare Cabin Embarked 
 1 1 0 3 ... 7.25 NaN S 
 2 2 1 1 ... 71.2833 C85 C 
 3 3 1 3 ... 7.925 NaN S 
 4 4 1 1 ... 53.1 C123 S 

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

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

skiprows эту проблему, используя аргумент skiprows:

 import pandas as pd 
 
 col_names = ['Id', 
 'Survived', 
 'Passenger Class', 
 'Full Name', 
 'Gender', 
 'Age', 
 'SibSp', 
 'Parch', 
 'Ticket Number', 
 'Price', 'Cabin', 
 'Station'] 
 
 titanic_data = pd.read_csv(r'E:\Datasets\titanic.csv', names=col_names, skiprows=[0]) 
 print(titanic_data.head()) 

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

 Id Survived Passenger Class ... Price Cabin Station 
 0 1 0 3 ... 7.2500 NaN S 
 1 2 1 1 ... 71.2833 C85 C 
 2 3 1 3 ... 7.9250 NaN S 
 3 4 1 1 ... 53.1000 C123 S 
 4 5 0 3 ... 8.0500 NaN S 

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

 titanic_data = pd.read_csv(r'E:\Datasets\titanic.csv', names=col_names, skiprows=[0, 4, 7]) 
 print(titanic_data.head(10)) 

В результате DataFrame , в котором нет некоторых из строк, которые мы видели раньше:

 Id Survived Passenger Class ... Price Cabin Station 
 0 1 0 3 ... 7.2500 NaN S 
 1 2 1 1 ... 71.2833 C85 C 
 2 3 1 3 ... 7.9250 NaN S 
 3 5 0 3 ... 8.0500 NaN S 
 4 6 0 3 ... 8.4583 NaN Q 
 5 8 0 3 ... 21.0750 NaN S 
 6 9 1 3 ... 11.1333 NaN S 
 7 10 1 2 ... 30.0708 NaN C 
 8 11 1 3 ... 16.7000 G6 S 
 9 12 1 1 ... 26.5500 C103 S 

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

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

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

 titanic_data = pd.read_csv(r'E:\Datasets\titanic.csv', header=None, skiprows=[0]) 

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

 0 1 2 3 4 ... 7 8 9 
 0 1 0 3 Braund, Mr. Owen Harris male ... 0 A/5 21171 7.2500 
 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... 0 PC 17599 71.2833 
 2 3 1 3 Heikkinen, Miss. Laina female ... 0 STON/O2. 3101282 7.9250 
 3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female ... 0 113803 53.1000 
 4 5 0 3 Allen, Mr. William Henry male ... 0 373450 8.0500 

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

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

 titanic_data = pd.read_csv(r'E:\Datasets\titanic.csv', sep=';') 

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

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

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

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

 import pandas as pd 
 cities = pd.DataFrame([['Sacramento', 'California'], ['Miami', 'Florida']], columns=['City', 'State']) 
 cities.to_csv('cities.csv') 

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

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

 ,City,State 
 0,Sacramento,California 
 1,Miami,Florida 

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

 df = pd.read_csv('cities.csv') 
 print(df) 

Это приводит к:

 Unnamed: 0 City State 
 0 0 Sacramento California 
 1 1 Miami Florida 

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

При сохранении файла, давайте удостоверимся , что уронить индекс DataFrame :

 import pandas as pd 
 cities = pd.DataFrame([['Sacramento', 'California'], ['Miami', 'Florida']], columns=['City', 'State']) 
 cities.to_csv('cities.csv', index=False) 

Теперь это приводит к файлу, который содержит:

 City,State 
 Sacramento,California 
 Miami,Florida 

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

 df = pd.read_csv('cities.csv') 
 print(df) 

Это приводит к:

 City State 
 0 Sacramento California 
 1 Miami Florida 

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

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

 import pandas as pd 
 cities = pd.DataFrame([['Sacramento', 'California'], ['Miami', 'Florida']], columns=['City', 'State']) 
 new_column_names = ['City_Name', 'State_Name'] 
 cities.to_csv('cities.csv', index=False, header=new_column_names) 

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

 City_Name,State_Name 
 Sacramento,California 
 Miami,Florida 
 Washington DC,Unknown 

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

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

 import pandas as pd 
 cities = pd.DataFrame([['Sacramento', 'California'], ['Miami', 'Florida']], columns=['City', 'State']) 
 cities.to_csv('cities.csv', index=False, sep=';') 

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

 City;State 
 Sacramento;California 
 Miami;Florida 

Обработка отсутствующих значений

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

 import pandas as pd 
 cities = pd.DataFrame([['Sacramento', 'California'], ['Miami', 'Florida'], ['Washington DC', pd.NA]], columns=['City', 'State']) 
 cities.to_csv('cities.csv', index=False, na_rep='Unknown') 

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

 City,State 
 Sacramento,California 
 Miami,Florida 
 Washington DC,Unknown 

Заключение

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

comments powered by Disqus