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