Хотя вы можете читать и писать файлы 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.