Pd read csv: pandas.read_csv — pandas 1.1.2 documentation

Содержание

Pandas Урок — чтение файлов csv, создание dataframe и фильтрация данных

Pandas — одна из самых популярных библиотек Python для аналитики и работы с Data Science. Это как SQL для Python. Все потому, что pandas позволяет работать с двухмерными таблицами данных в Python. У нее есть и масса других особенностей. В этой серии руководств по pandas вы узнаете самое важное (и часто используемое), что необходимо знать аналитику или специалисту по Data Science. Это первая часть, в которой речь пойдет об основах.

Примечание: это практическое руководство, поэтому рекомендуется самостоятельно писать код, повторяя инструкции!

Чтобы разобраться со всем, необходимо…

  1. Установить Python3.7+, numpy и Pandas.
  2. Следующий шаг: подключиться к серверу (или локально) и запустить Jupyter. Затем открыть Jupyter Notebook в любимом браузере. Создайте новый ноутбук с именем «pandas_tutorial_1».
  3. Импортировать numpy и pandas в Jupyter Notebook с помощью двух строк кода:
    import numpy as np
    import pandas as pd
    

    Примечание: к «pandas» можно обращаться с помощью аббревиатуры «pd». Если в конце инструкции с import есть

    as pd, Jupyter Notebook понимает, что в будущем, при вводе pd подразумевается именно библиотека pandas.

Теперь все настроено! Переходим к руководству по pandas! Первый вопрос:

Как открывать файлы с данными в pandas

Информация может храниться в файлах .csv или таблицах SQL. Возможно, в файлах Excel. Или даже файлах .tsv. Или еще в каком-то другом формате. Но цель всегда одна и та же. Если необходимо анализировать данные с помощью pandas, нужна структура данных, совместимая с pandas.

Структуры данных Python

В pandas есть два вида структур данных: Series и DataFrame.

Series в pandas — это одномерная структура данных («одномерная ndarray»), которая хранит данные. Для каждого значения в ней есть уникальный индекс.

DataFrame — двухмерная структура, состоящая из колонок и строк. У колонок есть имена, а у строк — индексы.

В руководстве по pandas основной акцент будет сделан на DataFrames. Причина проста: с большей частью аналитических методов логичнее работать в двухмерной структуре.

Загрузка файла .csv в pandas DataFrame

Для загрузки .csv файла с данными в pandas используется функция read_csv().

Начнем с простого образца под названием zoo. В этот раз для практики вам предстоит создать файл .csv самостоятельно. Вот сырые данные:

animal,uniq_id,water_need
elephant,1001,500
elephant,1002,600
elephant,1003,550
tiger,1004,300
tiger,1005,320
tiger,1006,330
tiger,1007,290
tiger,1008,310
zebra,1009,200
zebra,1010,220
zebra,1011,240
zebra,1012,230
zebra,1013,220
zebra,1014,100
zebra,1015,80
lion,1016,420
lion,1017,600
lion,1018,500
lion,1019,390
kangaroo,1020,410
kangaroo,1021,430
kangaroo,1022,410

Вернемся во вкладку “Home”

https://you_ip:you_port/tree Jupyter для создания нового текстового файла…

затем скопируем данные выше, чтобы вставить информацию в этот текстовый файл…

…и назовем его zoo.csv!

Это ваш первый .csv файл.

Вернемся в Jupyter Notebook (который называется «pandas_tutorial_1») и откроем в нем этот .csv файл!

Для этого нужна функция read_csv()

Введем следующее в новую строку:

pd.read_csv('zoo.csv', delimiter=',')

Готово! Это файл zoo.csv, перенесенный в pandas. Это двухмерная таблица — DataFrame. Числа слева — это индексы. А названия колонок вверху взяты из первой строки файла zoo.csv.

На самом деле, вам вряд ли придется когда-нибудь создавать .csv файл для себя, как это было сделано в примере. Вы будете использовать готовые файлы с данными. Поэтому нужно знать, как загружать их на сервер!

Вот небольшой набор данных: ДАННЫЕ

Если кликнуть на ссылку, файл с данными загрузится на компьютер. Но он ведь не нужен вам на ПК. Его нужно загрузить на сервер и потом в Jupyter Notebook. Для этого нужно всего два шага.

Шаг 1) Вернуться в Jupyter Notebook и ввести эту команду:

!wget https://pythonru.com/downloads/pandas_tutorial_read.csv

Это загрузит файл pandas_tutorial_read.csv на сервер. Проверьте:

Если кликнуть на него…

…можно получить всю информацию из файла.

Шаг 2) Вернуться в Jupyter Notebook и использовать ту же функцию read_csv (не забыв поменять имя файла и значение разделителя):

pd.read_csv('pandas_tutorial_read.csv', delimete=';')

Данные загружены в pandas!

Что-то не так? В этот раз не было заголовка, поэтому его нужно настроить самостоятельно. Для этого необходимо добавить параметры имен в функцию!

pd.read_csv('pandas_tutorial_read.csv', delimiter=';', 
	    names=['my_datetime', 'event', 'country', 'user_id', 'source', 'topic'])  

Так лучше!
Теперь файл .csv окончательно загружен в pandas DataFrame .

Примечание: есть альтернативный способ. Вы можете загрузить файл .csv через URL напрямую. В этом случае данные не загрузятся на сервер данных.

pd.read_csv(
    'https://pythonru.com/downloads/pandas_tutorial_read.csv',
    delimiter=';', 
    names=['my_datetime', 'event', 'country', 
           'user_id', 'source', 'topic']
)  

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

Отбор данных из dataframe в pandas

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

Вывод всего dataframe

Базовый метод — вывести все данные из dataframe на экран. Для этого не придется запускать функцию pd.read_csv() снова и снова. Просто сохраните денные в переменную при чтении!

article_read = pd.read_csv(
    'pandas_tutorial_read.csv', 
    delimiter=';', 
    names = ['my_datetime', 'event', 'country', 
	    'user_id', 'source', 'topic']
)

После этого можно будет вызывать значение article_read каждый раз для вывода DataFrame!

Вывод части dataframe

Иногда удобно вывести не целый dataframe, заполнив экран данными, а выбрать несколько строк. Например, первые 5 строк можно вывести, набрав:

article_read.head()

Или последние 5 строк:

article_read.tail()

Или 5 случайных строк:

article_read.sample(5)

Вывод определенных колонок из dataframe

А это уже посложнее! Предположим, что вы хотите вывести только колонки «country» и «user_id».

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

article_read[['country', 'user_id']]

Есть предположения, почему здесь понадобились двойные квадратные скобки? Это может показаться сложным, но, возможно, так удастся запомнить: внешние скобки сообщают pandas, что вы хотите выбрать колонки, а внутренние — список (помните? Списки в Python указываются в квадратных скобках) имен колонок.

Поменяв порядок имен колонов, изменится и результат вывода.

Это DataFrame выбранных колонок.

Примечание: иногда (особенно в проектах аналитического прогнозирования) нужно получить объекты Series вместе DataFrames. Это можно сделать с помощью одного из способов:

  • article_read.user_id
  • article_read[‘user_id’]

Фильтрация определенных значений в dataframe

Если прошлый шаг показался сложным, то этот будет еще сложнее!

Предположим, что вы хотите сохранить только тех пользователей, которые представлены в источнике «SEO». Для этого нужно отфильтровать по значению «SEO» в колонке «source»:

article_read[article_read.source == 'SEO']

Важно понимать, как pandas работает с фильтрацией данных:

Шаг 1) В первую очередь он оценивает каждую строчку в квадратных скобках: является ли 'SEO' значением колонки article_read.source? Результат всегда будет булевым значением (

True или False).

Шаг 2) Затем он выводит каждую строку со значением True из таблицы article_read.

Выглядит сложно? Возможно. Но именно так это и работает, поэтому просто выучите, потому что пользоваться этим придется часто!

Функции могут использоваться одна за другой

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

Например, объединим эти два метода перебора:

article_read.head()[['country', 'user_id']]

Первая строчка выбирает первые 5 строк из набора данных. Потом она выбирает колонки «country» и «user_id».

Можно ли получить тот же результат с иной цепочкой функций? Конечно:

article_read[['country', 'user_id']].head()

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

А что будет, если заменить значение «article_read» на оригинальную функцию read_csv():

pd.read_csv(
    'pandas_tutorial_read.csv', 
    delimiter=';', 
    names = ['my_datetime', 'event', 'country', 'user_id', 'source', 'topic']
)[['country', 'user_id']].head()

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

Проверьте себя!

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

Выберите used_id , country и topic для пользователей из

country_2. Выведите первые 5 строк!

Вперед!

.

.

.

.

.

А вот и решение!

Его можно преподнести одной строкой:

article_read[article_read.country == 'country_2'][['user_id','topic', 'country']].head()

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

ar_filtered = article_read[article_read.country == 'country_2']
ar_filtered_cols = ar_filtered[['user_id','topic', 'country']]
ar_filtered_cols.head()

В любом случае, логика не отличается. Сначала берется оригинальный dataframe (article_read), затем отфильтровываются строки со значением для колонки country — country_2 ([article_read.country == 'country_2']). Потому берутся три нужные колонки ([['user_id', 'topic', 'country']]) и в конечном итоге выбираются только первые пять строк (.head()).

Итого

Вот и все. В следующей статье вы узнаете больше о разных методах агрегации (например, sum, mean, max, min) и группировки.

Python | Чтение csv с помощью pandas.read_csv ()

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

Импорт панд:

import pandas as pd

Код # 1: read_csv — это важная функция pandas для чтения CSV-файлов и выполнения операций с ними.

import pandas as pd

  

pd.read_csv("filename.csv")

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

Вот список параметров, которые он принимает со значениями по умолчанию .

pd.read_csv(filepath_or_buffer, sep=’, ‘, delimiter=None, header=’infer’, names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression=’infer’, thousands=None, decimal=b’.’, lineterminator=None, quotechar=’”‘, quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)

Не все из них очень важны, но их запоминание фактически экономит время выполнения одних и тех же функций самостоятельно. Можно просмотреть параметры любой функции, нажав shift + tab в блокноте jupyter. Полезные даны ниже с их использованием:

ParameterUse
filepath_or_bufferURL or Dir location of file
sepStands for seperator, default is ‘, ‘ as in csv(comma seperated values)
index_colMakes passed column as index instead of 0, 1, 2, 3…r
headerMakes passed row/s[int/int list] as header
use_colsOnly uses the passed col[string list] to make data frame
squeezeIf true and only one column is passed, returns pandas series
skiprowsSkips passed rows in new data frame

Ссылка на набор данных используется здесь .

Код № 2:

import pandas as pd

  

pd.read_csv(filepath_or_buffer = "pokemon.csv")

  

pd.read_csv("pokemon.csv", header =[1, 2])

  

pd.read_csv("pokemon.csv", index_col ='Type')

  

pd.read_csv("pokemon.csv", usecols =["Type"])

  

pd.read_csv("pokemon.csv", usecols =["Type"],

                              squeeze = True)

                                

pd.read_csv("pokemon.csv",

            skiprows = [1, 2, 3, 4])

Рекомендуемые посты:

Python | Чтение csv с помощью pandas.read_csv ()

0.00 (0%) 0 votes

Работа в Pandas с CSV, TXT, HTML, XML на примерах ~ PythonRu

Вы уже знакомы с библиотекой pandas и ее базовой функциональностью по анализу данных. Также знаете, что в ее основе лежат два типа данных: Dataframe и Series. На их основе выполняется большая часть взаимодействия с данными, вычислений и анализа.

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

Этот раздел посвящен функциям API I/O (ввода/вывода), которые pandas предоставляет для чтения и записи данных прямо в виде объектов Dataframe. Начнем с текстовых файлов, а затем перейдем к более сложным бинарным форматам.

А в конце узнаем, как взаимодействовать с распространенными базами данных, такими как SQL и NoSQL, используя для этого реальные примеры. Разберем, как считывать данные из базы данных, сохраняя их в виде Dataframe.

Инструменты API I/O

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

Первый шаг очень важен, поэтому для него представлен полноценный инструмент в библиотеке, называемый API I/O. Функции из него можно разделить на две категории: для чтения и для записи.

ЧтениеЗапись
read_csvto_csv
read_excelto_excel
read_hdfto_hdf
read_sqlto_sql
read_jsonto_json
read_htmlto_html
read_statato_stata
read_clipboardto_clipboard
read_pickleto_pickle
read_msgpackto_msgpack (экспериментальный)
read_gbqto_gbq (экспериментальный)

CSV и текстовые файлы

Все привыкли к записи и чтению файлов в текстовой форме. Чаще всего они представлены в табличной форме. Если значения в колонке разделены запятыми, то это формат CSV (значения, разделенные запятыми), который является, наверное, самым известным форматом.

Другие формы табличных данных могут использовать в качестве разделителей пробелы или отступы. Они хранятся в текстовых файлах разных типов (обычно с расширением .txt).

Такой тип файлов — самый распространенный источник данных, который легко расшифровывать и интерпретировать. Для этого pandas предлагает набор функций:

Чтение данных из CSV или текстовых файлов

Самая распространенная операция по взаимодействию с данными при анализе данных — чтение их из файла CSV или как минимум текстового файла.

Для этого сперва нужно импортировать отдельные библиотеки.

>>> import numpy as np 
>>> import pandas as pd

Чтобы сначала увидеть, как pandas работает с этими данными, создадим маленький файл CSV в рабочем каталоге, как показано на следующем изображении и сохраним его как ch05_01.csv.

white,red,blue,green,animal
1,5,2,3,cat
2,7,8,5,dog
3,3,6,7,horse
2,2,8,3,duck
4,4,2,1,mouse

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

>>> csvframe = pd.read_csv('ch05_01.csv')
>>> csvframe
whiteredbluegreenanimal
01523cat
12785dog
23367horse
32283duck
44421mouse

Это простая операция. Файлы CSV — это табличные данные, где значения одной колонки разделены запятыми. Поскольку это все еще текстовые файлы, то подойдет и функция read_table(), но в таком случае нужно явно указывать разделитель.

>>> pd.read_table('ch05_01.csv',sep=',')
whiteredbluegreenanimal
01523cat
12785dog
23367horse
32283duck
44421mouse

В этом примере все заголовки, обозначающие названия колонок, определены в первой строчке. Но это не всегда работает именно так. Иногда сами данные начинаются с первой строки.

Создадим файл ch05_02.csv

1,5,2,3,cat
2,7,8,5,dog
3,3,6,7,horse
2,2,8,3,duck
4,4,2,1,mouse
>>> pd.read_csv('ch05_02.csv')
1523cat
02785dog
13367horse
22283duck
34421mouse
44421mouse

В таком случае нужно убедиться, что pandas не присвоит названиям колонок значения первой строки, передав None параметру header.

>>> pd.read_csv('ch05_02.csv', header=None)
01234
01523cat
12785dog
23367horse
32283duck
44421mouse

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

>>> pd.read_csv('ch05_02.csv', names=['white','red','blue','green','animal'])
whiteredbluegreenanimal
01523cat
12785dog
23367horse
32283duck
44421mouse

В более сложных случаях когда нужно создать Dataframe с иерархической структурой на основе данных из файла CSV, можно расширить возможности функции read_csv() добавив параметр index_col, который конвертирует колонки в значения индексов.

Чтобы лучше разобраться с этой особенностью, создайте новый CSV-файл с двумя колонками, которые будут индексами в иерархии. Затем сохраните его в рабочую директорию под именем ch05_03.csv.

Создадим файл ch05_03.csv

color,status,item1,item2,item3
black,up,3,4,6
black,down,2,6,7
white,up,5,5,5
white,down,3,3,2
white,left,1,2,1
red,up,2,2,2
red,down,1,1,4
>>> pd.read_csv('ch05_03.csv', index_col=['color','status'])
item1item2item3
colorstatus
blackup346
down267
whiteup555
down332
left121
redup222
down114

Использованием RegExp для парсинга файлов TXT

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

Чтобы лучше понимать regexp и то, как их использовать для разделения данных, начнем с простого примера. Например, предположим, что файл TXT имеет значения, разделенные пробелами и отступами хаотично. В таком случае regexp подойдут идеально, ведь они позволяют учитывать оба вида разделителей. Подстановочный символ /s* отвечает за все символы пробелов и отступов (если нужны только отступы, то используется /t), а * указывает на то, что символов может быть несколько. Таким образом значения могут быть разделены большим количеством пробелов.

.Любой символ за исключением новой строки
\dЦифра
\DНе-цифровое значение
\sПробел
\SНе-пробельное значение
\nНовая строка
\tОтступ
\uxxxxСимвол Unicode в шестнадцатеричном виде

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

Создадим файл ch05_04.txt

white red blue green
 1 5 2 3
 2 7 8 5
 3 3 6 7
>>> pd.read_table('ch05_04.txt',sep='\s+', engine='python')
whiteredbluegreen
01523
12785
23367

Результатом будет идеальный Dataframe, в котором все значения корректно отсортированы.

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

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

Не забудьте задать параметр None для параметра header, если в файле нет заголовков колонок.
Создадим файл ch05_05.txt

000END123AAA122
001END124BBB321
002END125CCC333
>>> pd.read_table('ch05_05.txt', sep='\D+', header=None, engine='python')
012
00123122
11124321
22125333

Еще один распространенный пример — удаление из данных отдельных строк при извлечении. Так, не всегда нужны заголовки или комментарии. Благодаря параметру skiprows можно исключить любые строки, просто присвоим ему массив с номерами строк, которые не нужно парсить.

Обратите внимание на способ использования параметра. Если нужно исключить первые пять строк, то необходимо писать skiprows = 5, но для удаления только пятой строки — [5].
Создадим файл ch05_06.txt

########### LOG FILE ############
This file has been generated by automatic system
white,red,blue,green,animal
12-Feb-2015: Counting of animals inside the house
1,5,2,3,cat
2,7,8,5,dog
13-Feb-2015: Counting of animals outside the house
3,3,6,7,horse
2,2,8,3,duck
4,4,2,1,mouse
>>> pd.read_table('ch05_06.txt',sep=',',skiprows=[0,1,3,6])
whiteredbluegreenanimal
01523cat
12785dog
23367horse
32283duck
44421mouse

Чтение файлов TXT с разделением на части

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

Если требуется получить лишь часть файла, можно явно указать количество требуемых строк. Благодаря параметрам nrows и skiprows можно выбрать стартовую строку n (n = SkipRows) и количество строк, которые нужно считать после (nrows = 1).

>>> pd.read_csv('ch05_02.csv',skiprows=[2],nrows=3,header=None)
01234
01523cat
12785dog
22283duck

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

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

>>> out = pd.Series()
>>> i = 0
>>> pieces = pd.read_csv('ch05_01.csv',chunksize=3)
>>> for piece in pieces:
...     out.set_value(i,piece['white'].sum())
...     i = i + 1
...
>>> out
0 6
1 6
dtype: int64

Запись данных в CSV

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

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

>>> frame = pd.DataFrame(np.arange(16).reshape((4,4)),
		 index = ['red', 'blue', 'yellow', 'white'],
		 columns = ['ball', 'pen', 'pencil', 'paper'])
>>> frame.to_csv('ch05_07.csv')

Если открыть новый файл ch05_07.csv, сгенерированный библиотекой pandas, то он будет напоминать следующее:

,ball,pen,pencil,paper
0,1,2,3
4,5,6,7
8,9,10,11
12,13,14,15

На предыдущем примере видно, что при записи Dataframe в файл индексы и колонки отмечаются в файле по умолчанию. Это поведение можно изменить с помощью параметров index и header. Им нужно передать значение False.

>>> frame.to_csv('ch05_07b.csv', index=False, header=False)

Файл ch05_07b.csv

1,2,3
5,6,7
9,10,11
13,14,15

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

>>> frame3 = pd.DataFrame([[6,np.nan,np.nan,6,np.nan],
... 	      [np.nan,np.nan,np.nan,np.nan,np.nan],
... 	      [np.nan,np.nan,np.nan,np.nan,np.nan],
...	      [20,np.nan,np.nan,20.0,np.nan],
... 	      [19,np.nan,np.nan,19.0,np.nan]
... 	      ],
... 		     index=['blue','green','red','white','yellow'],
...		     columns=['ball','mug','paper','pen','pencil'])
>>> frame3
Unnamed: 0ballmugpaperpenpencil
0blue6.0NaNNaN6.0NaN
1greenNaNNaNNaNNaNNaN
2redNaNNaNNaNNaNNaN
3white20.0NaNNaN20.0NaN
4yellow19.0NaNNaN19.0NaN
>>> frame3.to_csv('ch05_08.csv')
,ball,mug,paper,pen,pencil
blue,6.0,,,6.0,
green,,,,,
red,,,,,
white,20.0,,,20.0,
yellow,19.0,,,19.0,

Но их можно заменить на любое значение, воспользовавшись параметром na_rep из функции to_csv. Это может быть NULL, 0 или то же NaN.

>>> frame3.to_csv('ch05_09.csv', na_rep ='NaN')
,ball,mug,paper,pen,pencil
blue,6.0,NaN,NaN,6.0,NaN
green,NaN,NaN,NaN,NaN,NaN
red,NaN,NaN,NaN,NaN,NaN
white,20.0,NaN,NaN,20.0,NaN
yellow,19.0,NaN,NaN,19.0,NaN

Примечание: в предыдущих примерах использовались только объекты Dataframe, но все функции применимы и по отношению к Series.

Чтение и запись файлов HTML

pandas предоставляет соответствующую пару функций API I/O для формата HTML.

Эти две функции очень полезны. С их помощью можно просто конвертировать сложные структуры данных, такие как Dataframe, прямо в таблицы HTML, не углубляясь в синтаксис.

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

Такая деятельность называется парсингом (веб-скрапингом). Этот процесс становится фундаментальным элементом первого этапа анализа данных: поиска и подготовки.

Примечание: многие сайты используют HTML5 для предотвращения ошибок недостающих модулей или сообщений об ошибках. Настоятельно рекомендуется использовать модуль html5lib в Anaconda.
conda install html5lib

Запись данных в HTML

При записи Dataframe в HTML-таблицу внутренняя структура объекта автоматически конвертируется в сетку вложенных тегов <th>, <tr> и <td>, сохраняя иерархию. Для этой функции даже не нужно знать HTML.

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

Сначала создадим простейший Dataframe. Дальше с помощью функции to_html() прямо конвертируем его в таблицу HTML.

>>> frame = pd.DataFrame(np.arange(4).reshape(2,2))

Поскольку функции API I/O определены в структуре данных pandas, вызывать to_html() можно прямо к экземпляру Dataframe.

>>> print(frame.to_html())
<table border="1">
  <thead>
    <tr>
      <th></th>
      <th>0</th>
      <th>1</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>

Результат — готовая таблица HTML, сохранившая всю внутреннюю структуру.

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

>>> frame = pd.DataFrame(np.random.random((4,4)),
... 			index = ['white','black','red','blue'],
... 			columns = ['up','down','right','left'])
>>> frame
updownrightleft
white0.4203780.5333640.7589680.132560
black0.7117750.3755980.9368470.495377
red0.6305470.9985880.5924960.076336
blue0.3087520.1580570.6477390.907514

Теперь попробуем написать страницу HTML с помощью генерации строк. Это простой пример, но он позволит разобраться с функциональностью pandas прямо в браузере.

Сначала создадим строку, которая содержит код HTML-страницы.

>>> s = ['<HTML>']
>>> s.append('<HEAD><TITLE>My DataFrame</TITLE></HEAD>')
>>> s.append('<BODY>')
>>> s.append(frame.to_html())
>>> s.append('</BODY></HTML>')
>>> html = ''.join(s)

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

>>> html_file = open('myFrame.html','w')
>>> html_file.write(html)
>>> html_file.close()

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

Чтение данных из HTML-файла

pandas может с легкостью генерировать HTML-таблицы на основе данных Dataframe. Обратный процесс тоже возможен. Функция read_html() осуществляет парсинг HTML и ищет таблицу. В случае успеха она конвертирует ее в Dataframe, который можно использовать в процессе анализа данных.

Если точнее, то read_html() возвращает список объектов Dataframe, даже если таблица одна. Источник может быть разных типов. Например, может потребоваться прочитать HTML-файл в любой папке. Или попробовать парсить HTML из прошлого примера:

>>> web_frames = pd.read_html('myFrame.html')
>>> web_frames[0]
Unnamed: 0updownrightleft
0white0.4203780.5333640.7589680.132560
1black0.7117750.3755980.9368470.495377
2red0.6305470.9985880.5924960.076336
3blue0.3087520.1580570.6477390.907514

Все теги, отвечающие за формирование таблицы в HTML в финальном объекте не представлены. web_frames — это список Dataframe, хотя в этом случае объект был всего один. К нему можно обратиться стандартным путем. Здесь достаточно лишь указать на него через индекс 0.

Но самый распространенный режим работы функции read_html() — прямой парсинг ссылки. Таким образом страницы парсятся прямо, а из них извлекаются таблицы.

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

>>> ranking = pd.read_html('https://www.meccanismocomplesso.org/en/
meccanismo-complesso-sito-2/classifica-punteggio/')
>>> ranking[0]
#NomeExpLivelliright
01Fabio Nelli17521NaN
12admin9029NaN
23BrunoOrsini2124NaN
247248emilibassi1NaN
248249mehrbano1NaN
249250NIKITA PANCHAL1NaN

Чтение данных из XML

В списке функции API I/O нет конкретного инструмента для работы с форматом XML (Extensible Markup Language). Тем не менее он очень важный, поскольку многие структурированные данные представлены именно в нем. Но это и не проблема, ведь в Python есть много других библиотек (помимо pandas), которые подходят для чтения и записи данных в формате XML.

Одна их них называется lxml и она обеспечивает идеальную производительность при парсинге даже самых крупных файлов. Этот раздел будет посвящен ее использованию, интеграции с pandas и способам получения Dataframe с нужными данными. Больше подробностей о lxml есть на официальном сайте http://lxml.de/index.html.

Возьмем в качестве примера следующий файл. Сохраните его в рабочей директории с названием books.xml.

<?xml version="1.0"?>
<Catalog>
 <Book>
   <Author>Ross, Mark</Author>
   <Title>XML Cookbook</Title>
   <Genre>Computer</Genre>
   <Price>23.56</Price>
   <PublishDate>2014-22-01</PublishDate>
 </Book>
 <Book>
   <Author>Bracket, Barbara</Author>
   <Title>XML for Dummies</Title>
   <Genre>Computer</Genre>
   <Price>35.95</Price>
   <PublishDate>2014-12-16</PublishDate>
 </Book>
</Catalog>

В этом примере структура файла будет конвертирована и преподнесена в виде Dataframe. В первую очередь нужно импортировать субмодуль objectify из библиотеки.

>>> from lxml import objectify

Теперь нужно всего лишь использовать его функцию parse().

>>> xml = objectify.parse('books.xml')
>>> xml
<lxml.etree._ElementTree object at 0x0000000009734E08>

Результатом будет объект tree, который является внутренней структурой данных модуля lxml.

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

>>> root = xml.getroot()

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

>>> root.Book.Author
'Ross, Mark'
>>> root.Book.PublishDate
'2014-22-01'

В такой способ доступ к узлам можно получить индивидуально. А getchildren() обеспечит доступ ко всем дочерним элементами.

>>> root.getchildren()
[<Element Book at 0x9c66688>, <Element Book at 0x9c66e08>]

При использовании атрибута tag вы получаете название соответствующего тега из родительского узла.

>>> [child.tag for child in root.Book.getchildren()]
['Author', 'Title', 'Genre', 'Price', 'PublishDate']

А text покажет значения в этих тегах.

>>> [child.text for child in root.Book.getchildren()]
['Ross, Mark', 'XML Cookbook', 'Computer', '23.56', '2014-22-01']

Но вне зависимости от возможности двигаться по структуре lxml.etree, ее нужно конвертировать в Dataframe. Воспользуйтесь следующей функцией, которая анализирует содержимое eTree и заполняет им Dataframe строчка за строчкой.

>>> def etree2df(root):
...     column_names = []
...     for i in range(0, len(root.getchildren()[0].getchildren())):
...         column_names.append(root.getchildren()[0].getchildren()[i].tag)
...     xmlframe = pd.DataFrame(columns=column_names)
...     for j in range(0, len(root.getchildren())):
...         obj = root.getchildren()[j].getchildren()
...         texts = []
...         for k in range(0, len(column_names)):
...             texts.append(obj[k].text)
...         row = dict(zip(column_names, texts))
...         row_s = pd.Series(row)
...         row_s.name = j
...         xmlframe = xmlframe.append(row_s)
...     return xmlframe
>>> etree2df(root)
AuthorTitleGenrePricePublishDate
0Ross, MarkXML CookbookComputer23.562014-01-22
1Bracket, BarbaraXML for DummiesComputer35.952014-12-16

Моя шпаргалка по pandas / Блог компании RUVDS.com / Хабр

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

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

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

1. Подготовка к работе


Если вы хотите самостоятельно опробовать то, о чём тут пойдёт речь, загрузите набор данных Anime Recommendations Database с Kaggle. Распакуйте его и поместите в ту же папку, где находится ваш Jupyter Notebook (далее — блокнот).

Теперь выполните следующие команды.

import pandas as pd
import numpy as np
anime = pd.read_csv('anime-recommendations-database/anime.csv')
rating = pd.read_csv('anime-recommendations-database/rating.csv')
anime_modified = anime.set_index('name')

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

2. Импорт данных


▍Загрузка CSV-данных


Здесь я хочу рассказать о преобразовании CSV-данных непосредственно в датафреймы (в объекты Dataframe). Иногда при загрузке данных формата CSV нужно указывать их кодировку (например, это может выглядеть как encoding='ISO-8859–1'). Это — первое, что стоит попробовать сделать в том случае, если оказывается, что после загрузки данных датафрейм содержит нечитаемые символы.
anime = pd.read_csv('anime-recommendations-database/anime.csv')


Загруженные CSV-данные

Существует похожая функция для загрузки данных из Excel-файлов — pd.read_excel.

▍Создание датафрейма из данных, введённых вручную


Это может пригодиться тогда, когда нужно вручную ввести в программу простые данные. Например — если нужно оценить изменения, претерпеваемые данными, проходящими через конвейер обработки данных.
df = pd.DataFrame([[1,'Bob', 'Builder'],
                  [2,'Sally', 'Baker'],
                  [3,'Scott', 'Candle Stick Maker']], 
columns=['id','name', 'occupation'])


Данные, введённые вручную

▍Копирование датафрейма


Копирование датафреймов может пригодиться в ситуациях, когда требуется внести в данные изменения, но при этом надо и сохранить оригинал. Если датафреймы нужно копировать, то рекомендуется делать это сразу после их загрузки.
anime_copy = anime.copy(deep=True)


Копия датафрейма

3. Экспорт данных


▍Экспорт в формат CSV


При экспорте данных они сохраняются в той же папке, где находится блокнот. Ниже показан пример сохранения первых 10 строк датафрейма, но то, что именно сохранять, зависит от конкретной задачи.
rating[:10].to_csv('saved_ratings.csv', index=False)

Экспортировать данные в виде Excel-файлов можно с помощью функции df.to_excel.

4. Просмотр и исследование данных


▍Получение n записей из начала или конца датафрейма


Сначала поговорим о выводе первых n элементов датафрейма. Я часто вывожу некоторое количество элементов из начала датафрейма где-нибудь в блокноте. Это позволяет мне удобно обращаться к этим данным в том случае, если я забуду о том, что именно находится в датафрейме. Похожую роль играет и вывод нескольких последних элементов.
anime.head(3)
rating.tail(1)


Данные из начала датафрейма
Данные из конца датафрейма

▍Подсчёт количества строк в датафрейме


Функция len(), которую я тут покажу, не входит в состав pandas. Но она хорошо подходит для подсчёта количества строк датафреймов. Результаты её работы можно сохранить в переменной и воспользоваться ими там, где они нужны.
len(df)
#=> 3

▍Подсчёт количества уникальных значений в столбце


Для подсчёта количества уникальных значений в столбце можно воспользоваться такой конструкцией:
len(ratings['user_id'].unique())

▍Получение сведений о датафрейме


В сведения о датафрейме входит общая информация о нём вроде заголовка, количества значений, типов данных столбцов.
anime.info()


Сведения о датафрейме

Есть ещё одна функция, похожая на df.infodf.dtypes. Она лишь выводит сведения о типах данных столбцов.

▍Вывод статистических сведений о датафрейме


Знание статистических сведений о датафрейме весьма полезно в ситуациях, когда он содержит множество числовых значений. Например, знание среднего, минимального и максимального значений столбца rating даёт нам некоторое понимание того, как, в целом, выглядит датафрейм. Вот соответствующая команда:
anime.describe()


Статистические сведения о датафрейме

▍Подсчёт количества значений


Для того чтобы подсчитать количество значений в конкретном столбце, можно воспользоваться следующей конструкцией:
anime.type.value_counts()


Подсчёт количества элементов в столбце

5. Извлечение информации из датафреймов


▍Создание списка или объекта Series на основе значений столбца


Это может пригодиться в тех случаях, когда требуется извлекать значения столбцов в переменные x и y для обучения модели. Здесь применимы следующие команды:
anime['genre'].tolist()
anime['genre']


Результаты работы команды anime[‘genre’].tolist()
Результаты работы команды anime[‘genre’]

▍Получение списка значений из индекса


Поговорим о получении списков значений из индекса. Обратите внимание на то, что я здесь использовал датафрейм anime_modified, так как его индексные значения выглядят интереснее.
anime_modified.index.tolist()


Результаты выполнения команды

▍Получение списка значений столбцов


Вот команда, которая позволяет получить список значений столбцов:
anime.columns.tolist()


Результаты выполнения команды

6. Добавление данных в датафрейм и удаление их из него


▍Присоединение к датафрейму нового столбца с заданным значением


Иногда мне приходится добавлять в датафреймы новые столбцы. Например — в случаях, когда у меня есть тестовый и обучающий наборы в двух разных датафреймах, и мне, прежде чем их скомбинировать, нужно пометить их так, чтобы потом их можно было бы различить. Для этого используется такая конструкция:
anime['train set'] = True

▍Создание нового датафрейма из подмножества столбцов


Это может пригодиться в том случае, если требуется сохранить в новом датафрейме несколько столбцов огромного датафрейма, но при этом не хочется выписывать имена столбцов, которые нужно удалить.
anime[['name','episodes']]


Результат выполнения команды

▍Удаление заданных столбцов


Этот приём может оказаться полезным в том случае, если из датафрейма нужно удалить лишь несколько столбцов. Если удалять нужно много столбцов, то эта задача может оказаться довольно-таки утомительной, поэтому тут я предпочитаю пользоваться возможностью, описанной в предыдущем разделе.
anime.drop(['anime_id', 'genre', 'members'], axis=1).head()


Результаты выполнения команды

▍Добавление в датафрейм строки с суммой значений из других строк


Для демонстрации этого примера самостоятельно создадим небольшой датафрейм, с которым удобно работать. Самое интересное здесь — это конструкция df.sum(axis=0), которая позволяет получать суммы значений из различных строк. 
df = pd.DataFrame([[1,'Bob', 8000],
                  [2,'Sally', 9000],
                  [3,'Scott', 20]], columns=['id','name', 'power level'])
df.append(df.sum(axis=0), ignore_index=True)


Результат выполнения команды

Команда вида df.sum(axis=1) позволяет суммировать значения в столбцах.

Похожий механизм применим и для расчёта средних значений. Например — df.mean(axis=0).

7. Комбинирование датафреймов


▍Конкатенация двух датафреймов


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

В данном примере мы сначала разделяем датафрейм на две части, а потом снова объединяем эти части:

df1 = anime[0:2]
df2 = anime[2:4]
pd.concat([df1, df2], ignore_index=True)


Датафрейм df1
Датафрейм df2
Датафрейм, объединяющий df1 и df2

▍Слияние датафреймов


Функция df.merge, которую мы тут рассмотрим, похожа на левое соединение SQL. Она применяется тогда, когда два датафрейма нужно объединить по некоему столбцу.
rating.merge(anime, left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))


Результаты выполнения команды

8. Фильтрация


▍Получение строк с нужными индексными значениями


Индексными значениями датафрейма anime_modified являются названия аниме. Обратите внимание на то, как мы используем эти названия для выбора конкретных столбцов.
anime_modified.loc[['Haikyuu!! Second Season','Gintama']]


Результаты выполнения команды

▍Получение строк по числовым индексам


Эта методика отличается от той, которая описана в предыдущем разделе. При использовании функции df.iloc первой строке назначается индекс 0, второй — индекс 1, и так далее. Такие индексы назначаются строкам даже в том случае, если датафрейм был модифицирован и в его индексном столбце используются строковые значения.

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

anime_modified.iloc[0:3]


Результаты выполнения команды

▍Получение строк по заданным значениям столбцов


Для получения строк датафрейма в ситуации, когда имеется список значений столбцов, можно воспользоваться следующей командой:
anime[anime['type'].isin(['TV', 'Movie'])]


Результаты выполнения команды

Если нас интересует единственное значение — можно воспользоваться такой конструкцией:

anime[anime[‘type’] == 'TV']

▍Получение среза датафрейма


Эта техника напоминает получение среза списка. А именно, речь идёт о получении фрагмента датафрейма, содержащего строки, соответствующие заданной конфигурации индексов.
anime[1:3]


Результаты выполнения команды

▍Фильтрация по значению


Из датафреймов можно выбирать строки, соответствующие заданному условию. Обратите внимание на то, что при использовании этого метода сохраняются существующие индексные значения.
anime[anime['rating'] > 8]


Результаты выполнения команды

9. Сортировка


Для сортировки датафреймов по значениям столбцов можно воспользоваться функцией df.sort_values:
anime.sort_values('rating', ascending=False)


Результаты выполнения команды

10. Агрегирование


▍Функция df.groupby и подсчёт количества записей


Вот как подсчитать количество записей с различными значениями в столбцах:
anime.groupby('type').count()


Результаты выполнения команды

▍Функция df.groupby и агрегирование столбцов различными способами


Обратите внимание на то, что здесь используется reset_index(). В противном случае столбец type становится индексным столбцом. В большинстве случаев я рекомендую делать то же самое.
anime.groupby(["type"]).agg({
  "rating": "sum",
  "episodes": "count",
  "name": "last"
}).reset_index()

▍Создание сводной таблицы


Для того чтобы извлечь из датафрейма некие данные, нет ничего лучше, чем сводная таблица. Обратите внимание на то, что здесь я серьёзно отфильтровал датафрейм, что ускорило создание сводной таблицы.
tmp_df = rating.copy()
tmp_df.sort_values('user_id', ascending=True, inplace=True)
tmp_df = tmp_df[tmp_df.user_id < 10] 
tmp_df = tmp_df[tmp_df.anime_id < 30]
tmp_df = tmp_df[tmp_df.rating != -1]
pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)


Результаты выполнения команды

11. Очистка данных


▍Запись в ячейки, содержащие значение NaN, какого-то другого значения


Здесь мы поговорим о записи значения 0 в ячейки, содержащие значение NaN. В этом примере мы создаём такую же сводную таблицу, как и ранее, но без использования fill_value=0. А затем используем функцию fillna(0) для замены значений NaN на 0.
pivot = pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum)
pivot.fillna(0)


Таблица, содержащая значения NaN
Результаты замены значений NaN на 0

12. Другие полезные возможности


▍Отбор случайных образцов из набора данных


Я использую функцию df.sample каждый раз, когда мне нужно получить небольшой случайный набор строк из большого датафрейма. Если используется параметр frac=1, то функция позволяет получить аналог исходного датафрейма, строки которого будут перемешаны.
anime.sample(frac=0.25)


Результаты выполнения команды

▍Перебор строк датафрейма


Следующая конструкция позволяет перебирать строки датафрейма:
for idx,row in anime[:2].iterrows():
    print(idx, row)


Результаты выполнения команды

▍Борьба с ошибкой IOPub data rate exceeded


Если вы сталкиваетесь с ошибкой IOPub data rate exceeded — попробуйте, при запуске Jupyter Notebook, воспользоваться следующей командой:
jupyter notebook — NotebookApp.iopub_data_rate_limit=1.0e10

Итоги


Здесь я рассказал о некоторых полезных приёмах использования pandas в среде Jupyter Notebook. Надеюсь, моя шпаргалка вам пригодится.

Уважаемые читатели! Есть ли какие-нибудь возможности pandas, без которых вы не представляете своей повседневной работы?

pandas.read_csv — документация pandas 0.23.4

Параметры:
filepath_or_buffer : str, pathlib.Path, py._path.local.LocalPath или любой \

объект с методом read () (например, дескриптор файла или StringIO)

Строка может быть URL-адресом. Допустимые схемы URL включают http, ftp, s3 и файл. Для файловых URL ожидается хост. Например, локальный файл может быть файлом: // localhost / путь / к / таблице.csv

сен : str, по умолчанию ‘,’

Используемый разделитель. Если sep равен None, механизм C не может автоматически определять разделитель, но механизм синтаксического анализа Python может, что означает, что последний будет использоваться и автоматически определять разделитель с помощью встроенного сниффера Python инструмент, csv.Sniffer . Кроме того, разделители длиннее 1 символа и отличается от '\ s +' будет интерпретироваться как регулярные выражения и также заставит использовать механизм синтаксического анализа Python.Обратите внимание, что регулярное выражение разделители склонны игнорировать цитируемые данные. Пример регулярного выражения: '\ r \ t'

разделитель : str, по умолчанию Нет

Альтернативное имя аргумента для сеп.

delim_whitespace : логическое значение, по умолчанию False

Указывает, будут ли пробелы (например, ' или ' \ t ') используется как сеп. Эквивалентно установке sep = '\ s +' . Если этот вариант установлено значение True, ничего не должно передаваться для разделителя параметр.

Новое в версии 0.18.1: поддержка парсера Python.

заголовок : int или список целых чисел, по умолчанию «infer»

Номера строк для использования в качестве имен столбцов и начало данные. Поведение по умолчанию — вывод имен столбцов: если имена отсутствуют передаются поведение идентично header = 0 и столбцу имена выводятся из первой строки файла, если столбец имена передаются явно, тогда поведение идентично Заголовок = Нет .Явно передайте заголовок = 0 , чтобы иметь возможность заменить существующие имена. Заголовок может быть списком целых чисел, указать расположение строк для мультииндекса в столбцах например [0,1,3]. Промежуточные строки, которые не указаны, будут пропущено (например, 2 в этом примере пропущено). Обратите внимание, что это параметр игнорирует закомментированные строки и пустые строки, если skip_blank_lines = True , поэтому header = 0 обозначает первую строку data, а не первую строку файла.

имен : в виде массива, по умолчанию Нет

Список используемых имен столбцов.Если файл не содержит строки заголовка, то вы должен явно передавать header = None. Дубликаты в этом списке вызовут будет выдано UserWarning .

index_col : int или sequence или False, по умолчанию нет

Столбец для использования в качестве меток строк DataFrame. Если дана последовательность, Используется MultiIndex. Если у вас есть искаженный файл с разделителями в конце каждой строки вы можете рассмотреть index_col = False, чтобы заставить pandas _not_ использовать первый столбец в качестве индекса (названия строк)

usecols : в виде списка или вызываемого, по умолчанию нет

Вернуть подмножество столбцов.Если в виде списка, все элементы должны либо быть позиционными (т.е. целочисленные индексы в столбцах документа) или строками которые соответствуют именам столбцов, предоставленным пользователем в именах или выводится из строки (строк) заголовка документа. Например, действительный список в виде usecols Параметр будет [0, 1, 2] или [‘foo’, ‘bar’, ‘baz’]. Элемент порядок игнорируется, поэтому usecols = [0, 1] совпадает с [1, 0] . Чтобы создать экземпляр DataFrame из данных с сохраненным порядком элементов, используйте pd.read_csv (data, usecols = ['foo', 'bar']) [['foo', 'bar']] для столбцов в порядке ['foo', 'bar'] или pd.read_csv (data, usecols = ['foo', 'bar']) [['bar', 'foo']] для заказа ['bar', 'foo'] .

Если вызываемая, вызываемая функция будет оцениваться по столбцу names, возвращающие имена, в которых вызываемая функция оценивается как True. An пример действительного вызываемого аргумента: лямбда x: x.upper () в ["AAA", "BBB", "DDD"] . Использование этого параметра приводит к гораздо более быстрому время анализа и меньшее использование памяти.

сжатие : логическое значение, по умолчанию False

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

префикс : str, по умолчанию нет

Префикс для добавления к номерам столбцов при отсутствии заголовка, например «X» для X0, X1,…

mangle_dupe_cols : логический, по умолчанию True

Дублирующиеся столбцы будут указаны как «X», «X.1»,… »X.N», а не ‘X’… ’X’. Передача False приведет к перезаписи данных, если есть повторяющиеся имена в столбцах.

dtype : Введите имя или словарь столбца -> тип, по умолчанию Нет

Тип данных для данных или столбцов. Например. {‘A’: np.float64, ‘b’: np.int

.

Python Pandas read_csv: загрузка данных из файлов CSV

Файлы CSV (значения, разделенные запятыми) являются распространенным форматом файлов для передачи и хранения данных. Способность читать, обрабатывать и записывать данные в файлы CSV и из них с помощью Python — ключевой навык, которым должен овладеть любой специалист по данным или бизнес-анализу. В этом посте мы рассмотрим, что такое файлы CSV, как читать файлы CSV в Pandas DataFrames и как записывать кадры данных обратно в файлы CSV после анализа.

Pandas — это самый популярный пакет для обработки данных в Python, а DataFrames — это тип данных Pandas для хранения табличных 2D-данных.

Загрузить файлы CSV в Python Pandas

Базовый процесс загрузки данных из файла CSV в фрейм данных Pandas (при этом все идет хорошо) достигается с помощью функции read_csv в Pandas:

 # Загрузить библиотеки Pandas с псевдонимом 'pd'
импортировать панд как pd

# Прочитать данные из файла 'filename.csv'
# (в том же каталоге, что и ваш процесс python)
# Управляйте разделителями, строками, именами столбцов с помощью read_csv (см. Ниже)
data = pd.read_csv ("filename.csv")

# Предварительный просмотр первых 5 строк загруженных данных
данные.head () 

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

  1. Понимание расширений файлов и типов файлов — что на самом деле означают буквы CSV? В чем разница между файлом .csv и файлом .txt?
  2. Понимание того, как данные представлены в файлах CSV — , если вы открываете файл CSV, как на самом деле выглядят данные?
  3. Понимание пути Python и ссылки на файл — каков абсолютный и относительный путь к файлу, который вы загружаете? В каком каталоге вы работаете?
  4. Форматы данных CSV и ошибки — общие ошибки с функцией.

Каждая из этих тем обсуждается ниже, и мы завершаем это руководство рассмотрением некоторых более продвинутых механизмов загрузки CSV и описанием некоторых общих преимуществ и недостатков формата CSV.

1. Расширения и типы файлов

Первым шагом к работе с файлами CSV является понимание концепции типов и расширений файлов.

  1. Данные хранятся на вашем компьютере в отдельных «файлах» или контейнерах, каждый из которых имеет свое имя.
  2. Каждый файл содержит данные разных типов — внутренняя структура документа Word сильно отличается от внутренней части изображения.
  3. Компьютеры определяют, как читать файлы, используя «расширение файла», то есть код, следующий за точкой («.») В имени файла.
  4. Итак, имя файла обычно имеет форму «<случайное имя>. <Расширение файла>». Примеры:
    • project1.DOCX — файл Microsoft Word с именем Project1.
    • shanes_file.TXT — простой текстовый файл с именем shanes_file
    • IMG_5673.JPG — файл изображения с именем IMG_5673.
    • Другие хорошо известные типы файлов и расширения включают: XLSX: Excel, PDF: формат переносимых документов, PNG — изображения, ZIP — сжатый формат файлов, GIF — анимация, MPEG — видео, MP3 — музыка и т. Д. См. Полный список расширений Вот.
  5. Файл CSV — это файл с расширением «.csv», например «Data.csv», «super_information.csv». CSV в этом случае сообщает компьютеру, что данные, содержащиеся в файле, имеют формат «значения, разделенные запятыми», который мы обсудим ниже.

Расширения файлов по умолчанию скрыты во многих операционных системах. Первый шаг, который любой уважающий себя инженер, инженер-программист или специалист по обработке данных сделает на новом компьютере, — это убедиться, что расширения файлов отображаются в их окнах проводника (Windows) или Finder (Mac).

Папка с отображением расширений файлов. Перед работой с файлами CSV убедитесь, что вы видите расширения файлов в своей операционной системе. Различное содержимое файла обозначается расширением файла или буквами после точки в имени файла.например TXT — это текст, DOCX — это Microsoft Word, PNG — изображения, CSV — данные значений, разделенных запятыми.

Чтобы проверить, отображаются ли расширения файлов в вашей системе, создайте новый текстовый документ с помощью Блокнота (Windows) или TextEdit (Mac) и сохраните его в папке по вашему выбору. Если вы не видите расширение «.txt» в своей папке при ее просмотре, вам придется изменить настройки.

  • В Microsoft Windows: откройте Панель управления> Оформление и персонализация. Теперь нажмите Параметры папки или Параметр проводника , как теперь он называется> вкладка «Просмотр».На этой вкладке в разделе «Дополнительные настройки» вы увидите опцию Скрыть расширения для известных типов файлов. Снимите флажок с этого параметра и нажмите Применить и ОК.
  • В Mac OS: откройте Finder> В меню выберите Finder> Настройки, нажмите «Дополнительно», установите флажок «Показать все расширения файлов».

2. Представление данных в файлах CSV

Файл «CSV», то есть файл с типом файла «csv», является базовым текстовым файлом. Любой текстовый редактор, например NotePad в Windows или TextEdit на Mac, может открыть файл CSV и показать его содержимое.Sublime Text — замечательный и многофункциональный текстовый редактор для любой платформы.

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

Пример набора данных таблицы и соответствующих данных в формате CSV показан на диаграмме ниже.

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

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

Другие разделители / разделители — файлы TSV

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

Однако выбор символа запятой «,» для разделителей столбцов является произвольным и может быть заменен там, где это необходимо.Популярные альтернативы включают табуляцию («\ t») и точку с запятой («;»). Файлы, разделенные табуляцией, известны как файлы TSV (значения, разделенные табуляцией).

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

Разделители в текстовых полях — Quotechar

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

Символ кавычки можно указать в Pandas.read_csv с помощью аргумента quotechar . По умолчанию (как и во многих системах) для него используются стандартные кавычки («). Любые запятые (или другие разделители, как показано ниже), которые встречаются между двумя кавычками, будут игнорироваться как разделители столбцов.

В показанном примере файл, разделенный точками с запятой, с кавычками в качестве символа кавычек загружается в Pandas и отображается в Excel.Использование quotechar позволяет столбцу «NickName» содержать точки с запятой без разделения на несколько столбцов.

Помимо запятых в файлах CSV, также популярны данные, разделенные табуляцией и точкой с запятой. Кавычки используются, если данные в столбце могут содержать разделительный знак. В этом случае столбец «NickName» содержит символы точки с запятой, поэтому этот столбец «цитируется». Укажите разделитель и символ кавычки в pandas.read_csv

3. Python — Пути, папки, файлы

Когда вы указываете имя файла для Pandas.read_csv, Python будет искать в вашем « текущем рабочем каталоге ». Ваш рабочий каталог — это обычно каталог, из которого вы запустили процесс Python или записную книжку Jupyter.

Pandas ищет в вашем «текущем рабочем каталоге» имя файла, которое вы указываете при открытии или загрузке файлов. Ошибка FileNotFoundError может быть связана с неправильным написанием имени файла или неправильным рабочим каталогом.

Поиск пути к Python

Путь к Python можно отобразить с помощью встроенного модуля os .Модуль ОС предназначен для зависимых от операционной системы функций программ и скриптов Python.

Чтобы найти текущий рабочий каталог, требуется функция os.getcwd () . Функция os.listdir () может использоваться для отображения всех файлов в каталоге, что является хорошей проверкой, чтобы увидеть, находится ли загружаемый вами CSV-файл в каталоге, как ожидалось.

 # Узнать ваш текущий рабочий каталог
импорт ОС
печать (os.getcwd ())

# Out: / Users / shane / Documents / blog

# Показать все файлы, найденные в вашем текущем рабочем каталоге
печать (os.listdir (os.getcwd ())


# Out: ['test_delimted.ssv', 'CSV Blog.ipynb', 'test_data.csv'] 

В приведенном выше примере мой текущий рабочий каталог находится в каталоге «/ Users / Shane / Document / blog». Любые файлы, находящиеся в этом каталоге, будут немедленно доступны функции Python file open () или функции чтения csv Pandas.

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

Загрузка файла: абсолютный и относительный пути

При указании имен файлов для функции read_csv вы можете указать как абсолютные, так и относительные пути к файлам.

  • Относительный путь — это путь к файлу, если вы начинаете с текущего рабочего каталога. В относительных путях обычно файл находится в подкаталоге рабочего каталога, и путь не начинается со спецификатора диска, например ( data / test_file.csv ). Персонажи ‘.. ’Используются для перехода в родительский каталог по относительному пути.
  • Абсолютный путь — это полный путь от базы вашей файловой системы до файла, который вы хотите загрузить, например c: /Documents/Shane/data/test_file.csv . Абсолютные пути начинаются со спецификатора диска ( c: / или d: / в Windows или ‘/’ в Mac или Linux)

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

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

4. Ошибки загрузки CSV-файла Pandas

Наиболее частые ошибки, которые вы получите при загрузке данных из CSV-файлов в Pandas, будут:

  1. FileNotFoundError: Файл b'filename.csv 'не существует
    A File Not Обнаруженная ошибка обычно связана с настройкой пути, текущим каталогом или путаницей имени файла (здесь может сыграть роль расширение файла!)
  2. UnicodeDecodeError: кодек 'utf-8' не может декодировать байт в позиции: недопустимый байт продолжения
    Ошибка декодирования Unicode обычно возникает из-за того, что не указана кодировка файла, и возникает, когда у вас есть файл с нестандартными символами.Для быстрого исправления попробуйте открыть файл в Sublime Text и повторно сохранить его с кодировкой «UTF-8».
  3. pandas.parser.CParserError: Ошибка токенизации данных.
    Ошибки синтаксического анализа могут быть вызваны необычными обстоятельствами, связанными с вашим форматом данных — попробуйте добавить параметр «engine =’ python ‘»к вызову функции read_csv; это изменяет внутреннюю функцию чтения данных на более медленный, но более стабильный метод.

Расширенная загрузка CSV

В функции Pandas read_csv () есть некоторые дополнительные гибкие параметры, которые полезно иметь в вашем арсенале методов науки о данных:

Определение типов данных

Как упоминалось ранее, файлы CSV не содержат информация любого типа для данных.Типы данных определяются путем изучения верхних строк файла, что может привести к ошибкам. Чтобы вручную указать типы данных для разных столбцов, можно использовать параметр dtype со словарем имен столбцов и применяемых типов данных, например: dtype = {"name": str, "age": np. int32} .

Обратите внимание, что для дат и времени, формат, столбцы и другое поведение можно настроить с помощью параметров parse_dates , date_parser , dayfirst , keep_date .

Пропуск и выбор строк и столбцов из файла

Параметр nrows указывает, сколько строк из верхней части файла CSV следует читать, что полезно для выборки большого файла без полной загрузки. Аналогично, параметр skiprows позволяет указать строки, которые следует исключить, либо в начале файла (укажите int), либо во всем файле (укажите список индексов строк). Точно так же можно использовать параметр usecols , чтобы указать, какие столбцы данных загружать.

Пользовательские символы отсутствующих значений

При экспорте данных в CSV из разных систем пропущенные значения могут быть указаны с помощью разных токенов. Параметр na_values ​​ позволяет настроить символы, которые распознаются как отсутствующие значения. Значения по умолчанию, интерпретируемые как NA / NaN: », ‘# N / A’, ‘# N / AN / A’, ‘#NA’, ‘-1. # IND’, ‘-1. # QNAN’, ‘-NaN’, ‘-nan’, ‘1. # IND’, ‘1. # QNAN’, ‘N / A’, ‘NA’, ‘NULL’, ‘NaN’, ‘н / д’, ‘nan ‘, ‘значение NULL’.

 # Расширенный пример загрузки CSV

данные = pd.read_csv (
    "data / files / complex_data_example.tsv", # относительный путь Python к подкаталогу
    sep = '\ t' # Файл значений, разделенных табуляцией.
    quotechar = "'", # одинарная кавычка разрешена как символ кавычки
    dtype = {"salary": int}, # Разбираем столбец salary как целое число
    usecols = ['имя', 'дата рождения', 'зарплата']. # Загружать только три указанных столбца.
    parse_dates = ['Birth_date'], # Интерпретировать столбец Birth_date как дату
    skiprows = 10, # Пропустить первые 10 строк файла
    na_values ​​= ['.',' ?? '] # Возьмите любую'. ' или '??' значения как NA
) 

Положительные и отрицательные стороны формата CSV

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

С положительной стороны:

  • Формат CSV универсален, и данные могут быть загружены практически любым программным обеспечением.
  • CSV-файлы просты для понимания и отладки с помощью основного текстового редактора.
  • CSV-файлы быстро создаются и загружаются в память перед анализом.

Однако формат CSV имеет некоторые отрицательные стороны:

  • В текстовом файле нет информации о типе данных, весь набор текста (даты, int vs float, строки) выводится только из данных.
  • Нет форматирования или информации о макете, которую можно сохранить — такие вещи, как шрифты, границы, настройки ширины столбцов из Microsoft Excel, будут потеряны.
  • Кодирование файлов может стать проблемой, если в текстовых полях есть символы, несовместимые с ASCII.
  • Формат CSV неэффективен; числа хранятся как символы, а не как двоичные значения, что расточительно.Однако вы обнаружите, что ваши данные CSV хорошо сжимаются с помощью сжатия zip.

Кроме того, чтобы противостоять некоторым из этих недостатков, два выдающихся разработчика науки о данных в экосистемах R и Python, Уэс МакКинни и Хэдли Уикхэм, недавно представили формат Feather Format, который стремится быть быстрым и простым , открытый, гибкий и многоплатформенный формат данных, который изначально поддерживает несколько типов данных.

Дополнительное чтение

  1. Официальная документация Pandas для функции read_csv.
  2. Python 3 Примечания о путях к файлам, рабочих каталогах и использовании модуля ОС.
  3. Datacamp Учебное пособие по загрузке файлов CSV , включая некоторые дополнительные команды ОС.
  4. PythonHow Загрузка CSV учебник.
  5. Крис Албон Заметки о загрузке CSV в пандах.
.

Как читать CSV-файл в Python с помощью Pandas | by Barney H.

Pandas DataFrames — это превосходная структура данных с помеченными осями (строками и столбцами). Вот пример pandas DataFrame, который мы будем использовать в качестве примера ниже:

Код для генерации DataFrame:

Pandas read_csv () функция импортирует файл CSV в формат DataFrame.

Вот несколько вариантов:

filepath_or_buffer: это имя файла или путь к файлу

 df.read_csv ('file_name.csv') # относительная позиция 
df.read_csv ('C: /Users/abc/Desktop/file_name.csv')

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

Значение по умолчанию: header = 0 , что означает, что первая строка файла CSV будет рассматриваться как имена столбцов.

Если у вашего файла нет заголовка, просто установите header = None .

 df.read_csv ('file_name.csv ’, header = None) # без заголовка 

Вывод без заголовка:

sep : укажите настраиваемый разделитель для ввода CSV, по умолчанию — запятая.

 pd.read_csv ('file_name.csv', sep = '\ t') # Используйте Tab для разделения 

index_col: Это позволяет вам установить, какие столбцы будут использоваться в качестве индекса фрейма данных. Значение по умолчанию — Нет, и pandas добавит новый столбец, начинающийся с 0, чтобы указать столбец индекса.

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

 pd.read_csv ('file_name.csv', index_col = 'Name') # Использовать столбец 'Name' как индекс 

nrows: Чтение только количества первых строк из файла. Требуется значение типа int.

usecols : укажите, какие столбцы импортировать в фрейм данных. Это может быть список значений типа int или имен столбцов.

 pd.read_csv ('file_name.csv', usecols = [1,2,3]) # Читает только col1, col2, col3. col0 будет проигнорирован. 
pd.read_csv ('file_name.csv', usecols = ['Name']) # Читает только столбец 'Name'.Остальные столбцы игнорируются.

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

na_values ​​: по умолчанию отсутствующие значения будут NaN. Используйте это, если хотите, чтобы другие строки рассматривались как NaN. Ожидаемый ввод — это список строк.

 pd.read_csv ('file_name.csv', na_values ​​= ['a', 'b']) # значения a и b будут обрабатываться как NaN после импорта в фрейм данных. 
.

Импортировать данные CSV с помощью Pandas.read_csv ()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *