Pandas - это библиотека Python с открытым исходным кодом, построенная на основе NumPy. Это позволяет выполнять быстрый анализ, а также очистку и подготовку данных. Легко представить себе Pandas, просто взглянув на него как на версию Microsoft Excel для Python.

Что мне нравится в Pandas, так это то, что он может хорошо работать с данными из самых разных источников, таких как; Лист Excel, файл csv, файл sql или даже веб-страницу.

Установка Pandas

Если у вас есть Anaconda, вы можете просто установить Pandas из вашего терминала или командной строки, используя:

conda install pandas

Если на вашем компьютере нет Anaconda, установите Pandas со своего терминала, используя:

pip install pandas

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

Серии

Серия - это одномерный массив, очень похожий на массив NumPy. Фактически, Series построены поверх объектов массива NumPy. Что отличает Series от массивов NumPy, так это то, что серии могут иметь метки доступа, с помощью которых они могут индексироваться.

import numpy as np
import pandas as pd

Вот основной синтаксис для создания серии панд:

my_series = pd.Series(data, index)

Из приведенного выше data может быть любым типом объекта, таким как словарь, список или даже массив NumPy, а index обозначает метки оси, с помощью которых будет индексироваться серия.

Мы собираемся создать серию из различных типов объектов.

Примечание. Важно отметить, что ось index не является обязательной. Это означает, что вы можете решить не передавать его. Если индекс не передан, Pandas создаст значение по умолчанию index со значениями [0, ..., len(data) - 1], как показано ниже:

Всякий раз, когда вы создаете серию из словаря Python, Pandas устанавливает ключи как index серии и устанавливает значения как соответствующие точки данных, как показано в out[24] выше.

Что отличает Pandas Series от массива NumPy, так это то, что Pandas Series может содержать различные типы объектов.

Получение информации из серии

Мы можем получать информацию из Серии так же, как и со словарем Python:

Выполнение арифметических операций над сериями

Операции с сериями выполняются на основе index. Когда мы используем любую из математических операций, таких как -, +, /, *, pandas выполняет вычисления, используя значение index . После этого результирующее значение преобразуется в число с плавающей запятой, чтобы вы не потеряли никакой информации.

Из приведенного выше, где Pandas не смог найти совпадение в Серии, он дает ему значение NaN.

DataFrames

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

Вот основной синтаксис для создания DataFrame:

pd.DataFrame(data,index)

Давайте создадим DataFrame из случайных чисел, имеющий 5 строк и 4 столбца:

Как мы видим, каждый из приведенных выше столбцов на самом деле представляет собой просто серию панд, и все они имеют общий index. Следовательно, можно с уверенностью сказать, что DataFrame - это набор Series, использующий один и тот же index. В приведенном ниже примере мы создадим DataFrame из серии:

Выбор столбцов из фреймов данных

Используя обозначение скобок [], мы можем легко извлекать объекты из DataFrame так же, как это делается с Series. Возьмем столбец name:

Поскольку мы взяли один столбец, он возвращает Series. Продолжайте и подтвердите возвращаемый тип данных с помощью type():

Если мы возьмем несколько столбцов, результатом будет DataFrame:

Добавление столбцов в фрейм данных

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

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

Удаление строк / столбцов из DataFrame

Мы можем удалить строку или столбец с помощью функции .drop(). При этом мы должны указать axis=0 для строки и axis=1 для столбца.

Важно отметить, что Pandas не удаляет строку / столбец навсегда, когда вы используете .drop() method, если вы не укажете ему это сделать. Это потому, что Pandas не хочет, чтобы вы случайно потеряли свои данные.

Продолжайте и подтвердите, позвонив df. Чтобы окончательно удалить строку / столбец, вы должны установить inplace=True следующим образом:

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

Чтобы выбрать строки, мы должны вызвать расположение строк с помощью .loc[], которое принимает имя метки, или .iloc[], которое принимает позицию индекса строки.

Мы также можем выбрать подмножество строк и столбцов, используя столбец notation:, указав нужную строку и столбец, как мы это делали в NumPy. Допустим, нам нужен 'Name’ в строке 'c' :

Условный выбор

Pandas позволяет выполнять условный выбор, используя скобки []. В приведенном ниже примере возвращаются строки, в которых 'W'>0 :

Допустим, мы хотим вернуть только значения столбца 'X', где 'W'>0 :

Попробуйте это: df[df['W']>0][['X','Y']] , у вас должно получиться следующее:

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

my_series = df['W']>0
result = df[my_series]
my_cols = ['X','Y']
result[my_cols]

Используя несколько условий, мы можем получить значения в DataFrame, комбинируя его с логическими операторами & (AND) и | (ИЛИ). Например, чтобы вернуть значения where'W'>0 и 'X'>1 , используйте:

Сброс индекса фрейма данных

Если ваш индекс выглядит не совсем так, как вы хотите, вы можете легко сбросить его с помощью.reset_index(). Это сбрасывает наш индекс DataFrame в столбец с именем index со значениями индекса Pandas по умолчанию [0, ..., len(data) - 1], которые являются нашим новым индексом.

Как и ожидалось, .reset_index() не сбрасывает индекс навсегда, пока вы не укажете, сказав: .reset_index(inplace=True)

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

Точно так же мы можем указать, какой столбец мы хотим использовать в качестве метки индекса, используя функцию set_index(). Для этого мы создадим новый столбец с именем"ID' и установим его в качестве нашего нового индекса:

В отличие от .reset_index(), который сбрасывает старый индекс и использует индекс Pandas по умолчанию в качестве нашего нового индекса, .set_index() полностью заменяет старый индекс.

Многоуровневый индекс ( MultiIndex) и иерархия индекса

MultiIndex - это просто массив кортежей, каждый из которых уникален. Его можно создать из списка массивов (используя MultiIndex.from_arrays), массива кортежей (используя MultiIndex.from_tuples) или скрещенного набора итераций (используя MultiIndex.from_product).

Давайте создадим MultiIndex из таблицы:

Мы можем взять строки из нашего MultiIndex, используя .loc[] следующим образом:

Как мы видим, первые два столбца нашего DataFrame df не имеют имен. Мы можем дать им имена, используя .index.names, вот так:

Поперечное сечение строк и столбцов

Используя метод .xs, мы можем легко выбирать данные на определенных уровнях MultiIndex. Например, предположим, что мы хотим захватить все уровни, где Num = 22:

Недостающие данные

Часто, когда вы используете Pandas для чтения данных и есть недостающие точки, Pandas автоматически заполняет эти недостающие точки значением NaN or Null. Следовательно, мы можем либо отбросить эти автоматически заполняемые значения с помощью .dropna(), либо заполнить их с помощью .fillna().

Скажем, у нас есть DataFrame:

Используя метод .dropna(), мы говорим Pandas удалить любую строку или столбец с одним или несколькими пропущенными значениями. Чтобы удалить строку, используйте .dropna(axis=0) и .dropna(axis=1), чтобы удалить столбец.

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

Точно так же, используя метод .fillna(), мы можем заменить отсутствующие значения в нашем DataFrame желаемым значением. Давайте заменим все значения NaN на 10:

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

Из приведенного выше среднее значение столбца 'A' равно 2,0, поэтому вторая строка заменяется на 2,0.

Точно так же .dropna() и .fillna() не появляются постоянно, пока вы не установите inplace=True

GroupBy

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

Используя метод .groupby(), мы можем группировать строки на основе 'Company' column и вызывать на нем агрегатную функцию .mean():

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

Подсчет

Используя count() method, мы можем получить, сколько раз элемент встречается в DataFrame.

Опишите

Метод .describe() используется для получения обзора того, как выглядит DataFrame. Он дает нам сводку по каждому индексу DataFrame.

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

Конкатенация, слияние и объединение фреймов данных

Конкатенация

Конкатенация в основном склеивает DataFrames. При объединении DataFrames имейте в виду, что измерения должны совпадать по оси, по которой выполняется объединение. Имея список DataFrames:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                        index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                        'B': ['B4', 'B5', 'B6', 'B7'],
                        'C': ['C4', 'C5', 'C6', 'C7'],
                        'D': ['D4', 'D5', 'D6', 'D7']},
                         index=[4, 5, 6, 7]) 
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                        'B': ['B8', 'B9', 'B10', 'B11'],
                        'C': ['C8', 'C9', 'C10', 'C11'],
                        'D': ['D8', 'D9', 'D10', 'D11']},
                        index=[8, 9, 10, 11])

Мы можем объединить их, используя методpd.concat():

Поскольку мы не указали ось, на которой должно происходить объединение, по умолчанию Pandas использует ось строк. Он соединил ряды вместе. Если мы хотим, чтобы конкатенация происходила по столбцу, мы должны установить axis=1:

Обратите внимание, что у нас есть несколько пропущенных значений. Это связано с тем, что в DataFrame не было значений для всех индексов, по которым мы хотели его объединить. Следовательно, при работе с pd.concat() убедитесь, что ваши данные правильно содержат всю информацию по оси.

Слияние

Используя функцию pd.merge(), Pandas позволяет вам объединять DataFrames вместе так же, как вы объединяете таблицы SQL. Синтаксис слияния DataFrames: pd.merge(left, right, how='inner', on='Key'. left обозначает DataFrame, который должен отображаться с левой стороны, right обозначает DataFrame, который должен отображаться с правой стороны, how='inner' обозначает, должна ли операция слияния обрабатываться как пересечение inner или объединение Outer. Наконец, on='Key' обозначает ключевой столбец, в котором происходит слияние. Этот ключевой столбец должен быть одинаковым для всех фреймов данных, прежде чем может произойти функция слияния.

Имея два DataFrames, оба из которых имеют столбец key, мы можем объединить их следующим образом:

Мы также можем объединить несколько ключей, просто передав ключи:

Присоединение

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

Поиск уникальных значений в DataFrame

Уникальные значения - это просто отдельные значения в DataFrame. Существует три основных полезных метода поиска уникальных значений в DataFrame.

Используя .unique(), мы можем найти все уникальные значения в col2 фрейма данных ниже:

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

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

Метод apply ()

Метод .apply() используется для вызова пользовательских функций в DataFrame. Представьте, что у нас есть функция:

В приведенном выше примере мы транслируем функцию каждому элементу столбца. Мы также можем применять встроенные функции к DataFrames. Допустим, мы хотим получить длину строк в col3:

Иногда вы можете определить функцию, которую в конечном итоге используете только один раз. Вместо определения такой функции в нескольких строках кода вы можете просто использовать лямбда-выражение, которое является сокращенной версией функции. Например, мы могли бы представить квадратную функцию в ln[47] выше с помощью лямбда-выражения:

Получение атрибутов DataFrame

Атрибуты - это имена столбцов и индексов DataFrame. Скажем, мы не уверены, содержат ли имена столбцов в нашем DataFrame пробелы, мы могли бы просто получить их атрибуты:

Сортировка и упорядочивание фрейма данных

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

Как видите, значения в col2 отображались в порядке убывания. Также обратите внимание, как index оставался прикрепленным к каждой строке, чтобы информация не терялась.

Поиск нулевых значений

Скажем, у вас большой набор данных, Pandas упростил поиск нулевых значений с помощью .isnull():

Сводная таблица

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

Мы можем создать из него сводную таблицу, используя синтаксис: .pivot_table(data, values='', index=[''], columns=[''])., где values представляет столбец, из которого мы хотим, чтобы точки данных состояли, index - столбец, по которому вы хотите сгруппировать данные, а columns представляет столбцы, по которым DataFrame должен быть определен. Подробнее о сводной таблице можно прочитать здесь.

В приведенном выше примере мы получили NaN значений, потому что не было значений, которые соответствовали бы этим конкретным точкам.

Ввод и вывод данных

Используя pd.read_ методы, Pandas позволяет вам получать доступ к данным из самых разных источников, таких как; лист Excel, csv, sql или html.

Чтобы ссылаться на любой из файлов, вы должны убедиться, что он находится в том же каталоге, что и ваш блокнот jupyter.

Чтение файла CSV

Используя pd.read_csv(), мы можем вывести содержимое файла .csv как DataFrame следующим образом:

Запись в файл CSV

Мы можем создать DataFrame и сохранить его в файле a.csv, используя .to_csv() следующим образом:

Чтобы убедиться, что данные были сохранены, прочтите CSV-файл, который вы только что создали с помощью pd.read_csv('New_dataframe').

Чтение из файла Excel

Файлы Excel - хорошие источники данных. Используя pd.read_excel(), мы можем импортировать данные из файла Excel. Имейте в виду, что Pandas может импортировать данные только в файл Excel и не может импортировать макросы, изображения или формулы в остальном. Наличие макросов, изображений или формул в вашем файле Excel может вызвать сбой pd.read_excel() method.

Допустим, у нас есть файл Excel 'excel_output.xlsx', давайте выведем его содержимое:

Имейте в виду, что каждый файл Excel содержит один или несколько листов. В нашем примере Sheet1 относится к конкретному листу в 'excel_output.xlsx', с которого мы хотим читать.

Запись в файл Excel

Как и в случае с csv, мы можем создать DataFrame и сохранить его в файле a.xlsx, используя .to_excel() следующим образом:

Чтение из HTML

Чтобы читать данные из файла HTML, вам необходимо установить htmllib5, lxml и BeautifulSoup4. В вашем терминале запустите:

conda install lxml
conda install html5lib
conda install BeautifulSoup4

Используя .read_html(), скажем Pandas читать таблицы с этой html-страницы. Поскольку на этой странице есть разные таблицы, мы можем получить доступ к конкретной таблице, которую хотим, используя номера индексов [0, ..., len(tables) - 1]. В этом примере мы вернем вторую таблицу на этой странице.

Мы подошли к концу этого урока, поздравляем!

Если вы завершили этот урок, вы должны хорошо знать, что такое Pandas и как использовать его для подготовки данных. Все, что вам нужно сейчас сделать, это практика! упражняться! упражняться!.

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