После изучения основ NumPy на прошлой неделе я решил начать изучать Pandas!

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

Объекты панд

Объекты Pandas — это просто улучшенные версии структурированных массивов NumPy, в которых строки и столбцы идентифицируются метками, а не целочисленными индексами. Тремя фундаментальными структурами данных Pandas являются Series, DataFrame и Index.

Объект серии Pandas

Объект Pandas Series представляет собой одномерный массив индексированных данных. Его можно создать из списка или массивов следующим образом:

data = pd.Series([0.25,0.5,0.75,1.0])

Объект Pandas DataFrame

Их можно рассматривать как специализацию словаря Python. Объект dataframe может быть создан из словарей Python:

data = pd.DataFrame({dictionary})
data.index #returns index labels
data.columns #returns an Index object holding column labels

DataFrame как специализированный словарь

DataFrame сопоставляет имя столбца с рядом данных столбца.

data['column'] = column data

Объект индекса Pandas

Объект Index можно рассматривать как неизменяемый массив. Вы можете построить объект Index, используя:

ind = pd.Index([list values])

Индексировать как неизменяемый массив

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

ind[1]
ing[::2]

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

Индексация и выборка данных

Методы индексации очень похожи на массивы NumPy.

Выбор данных в серии

Объект серии во многом похож на одномерный массив NumPy и очень похож на словарь Python.

Индексаторы: loc, iloc и ix

Атрибут loc позволяет выполнять индексирование и нарезку, которые всегда ссылаются на явный индекс:

data.loc[1]

Атрибут iloc позволяет выполнять индексирование и нарезку, которые всегда ссылаются на неявный индекс в стиле Python:

data.iloc[1]
data.iloc[1:3]

Работа с данными в Pandas

Сопоставление между операторами Python и методами Pandas:

Python operator                      Pandas method(s)
+                                    .add()
-                                    .sub(), .subtract()
*                                    .mul(), .multiply()
/                                    .truediv(), .div(), .divide()
//                                   .floordiv()
%                                    .mod()
**                                   .pow()

Обработка отсутствующих данных

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

Компромиссы в соглашениях об отсутствующих данных

В разных языках используются разные метки и способы обработки отсутствующих данных.

Отсутствуют данные в пандах

Pandas обрабатывает отсутствующие данные с помощью часовых и двух существующих нулевых значений Python: NaN и объекта Python None.

NaN: отсутствуют числовые данные

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

NumPy имеет несколько специальных агрегаций, которые игнорируют NaN:

np.nansum()
np.nanmin()
np.nanmax()

Работа с нулевыми значениями

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

isnull() #generates a boolean mask indicating missing values
notnull() #opposite of isnull()
dropna() #return a filtered version of the data
fillna() # return a copy of the day with missing values filled or
          imputed

Отбрасывание пустых значений

Методы не позволяют удалять отдельные значения NA из DataFrame; только полные строки или столбцы.

Заполнение нулевых значений

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

data.fillna(0) # fills NaN with 0's

Иерархическая индексация

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

Pandas Multidex

Вы можете создать несколько уровней индекса с помощью:

index = pd.MultiIndex.from_tuples(index) # index is predefined          tuples

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

pd.stack()

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

pd.unstack()

Агрегации данных мультииндексов

Pandas имеет встроенные методы агрегирования, такие как mean(), sum() и max(). С иерархическими индексированными данными вы можете передать параметр уровня, который определяет, на каком подмножестве данных вычисляется агрегат.

data_mean = data.mean(level = index)

Объединение наборов данных: Concat и Append

Объединение массивов NumPy

С помощью np.concatenate() вы объединяете содержимое двух или более массивов в один массив. Он может принимать ключевое слово оси, которое позволяет вам указать ось, по которой результат будет конкатенирован.

Простая конкатенация с помощью pd.concat

Pandas имеет аналогичную функцию pd.concat, которая содержит больше параметров, чем np.concatenate().

pd.concat(objs, axis=0, join='outer', join_axis=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

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

pd.concat(objs,axis='col')

Отлов нежелательных повторяющихся индексов

Чтобы убедиться, что индексы в результате pd.concat() не перекрываются, вы можете использовать флаг verify_integrity. Если для этого параметра установлено значение True, конкатенация вызовет исключение при наличии повторяющихся индексов.

Игнорирование индекса

Если индекс не имеет значения, вы можете использовать опцию ignore_index = True. Это создаст новый целочисленный индекс для результирующей конкатенации.

Добавление мультииндексных ключей

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

Конкатенация с объединениями

Вы можете объединять данные, даже если у них нет имен общих столбцов. Если есть какие-либо недостающие данные, Pandas заполнит их значениями NA. Вы можете изменить это, указав одну из нескольких опций для параметров join и join_axes функции конкатенации. По умолчанию объединение представляет собой объединение входных столбцов (join = ‘outer’), но мы можем изменить это, чтобы разрешить объединение имен общих столбцов только с join = ‘inner’.

pd.concat(objs, join='inner')

Вы можете напрямую указать индекс оставшихся столбцов, используя аргумент join_axes, который принимает список объектов индекса.

pd.concat(objs, join_axes=[objs.columns])

Метод append()

Объекты Series и DataFrame имеют метод добавления, который может объединять несколько объектов с меньшим количеством строк кода.

df1.append(df2)

Метод append не изменяет исходный объект — вместо этого он создает новый объект с объединенными данными. Это не очень эффективно, поскольку требует создания нового индекса и буфера данных. Лучший способ выполнить несколько операций добавления — создать список фреймов данных и передать их все сразу функции concat().

Объединение наборов данных: слияние и объединение

У Pandas есть метод pd.merge(), который может соединять наборы данных разными способами.

Соединения "один к одному"

Соединение один к одному очень похоже на конкатенацию по столбцам.

df1 = pd.DataFrame({dictionary})
df2 = pd.DataFrame({dictionary})
df3 = pd.merge(df1,df2)

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

Соединение "многие к одному"

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

Соединения "многие ко многим"

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

Спецификация ключа слияния

Ключевое слово on

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

pd.merge(df1,df2, on='column')

Это работает только в том случае, если и левый, и правый DataFrames имеют указанное имя столбца.

Ключевые слова left_on и right_on

Часто вам может понадобиться объединить два набора данных с разными именами столбцов; например, у нас может быть набор данных, в котором имя сотрудника помечено как «имя», а не как «сотрудник». Для этого мы можем использовать ключевые слова left_on и right_on, чтобы указать два объединяемых столбца:

pd.merge(df1,df2,left_on='employee',right_on='name')

Ключевые слова left_index и right_index

Вместо объединения столбцов мы также можем объединить индекс. Это можно сделать с помощью флагов left_index и right_index.

pd.merge(df1,df2,left_index=True,right_index=True)

Вы также можете реализовать метод join(), который выполняет слияние, по умолчанию объединяющее индексы:

df1.join(df2)

Вы можете смешивать объединяемые индексы и столбцы, комбинируя left_index с right_on или наоборот:

pd.merge(df1,df2,lefT_index=True,right_on='name')

Работа с временными рядами

Данные и данные времени поступают в несколько вариантов с пандами:

  • Отметки времени ссылаются на определенные моменты времени
  • Временные интервалы и период относятся к промежутку времени между конкретной начальной и конечной точкой.
  • Дельты времени или продолжительность ссылаются на точную продолжительность времени

Дата и время в Python

Типизированные массивы времени: datetime64 Numpy

Тип datetime64 dtype кодирует даты как 64-битные целые числа и позволяет очень компактно представлять массив дат.

    date = np.array('2015-07-04',dtype=np.datetime64)

Вы можете выполнять операции с векторизованными строками над этим массивом после его форматирования.

Даты и время в Pandas: лучшее из обоих миров

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

pd.to_datetime(args(integer,float,string,datetime,list,tuple),
               dayfirst(default false),
               yearfirst(default False),
               utc,
               box,
               format(strftime to parse time),
               exact,
               unit)

Временные ряды Pandas: индексирование по времени

Вы можете индексировать данные по временным меткам:

index = pd.Datetimeindex(args)

Структуры данных временных рядов Pandas

  • Для временных меток Pandas предоставляет тип Timestamp.
  • Для периодов времени Pandas предоставляет тип периода. Это кодирует интервал с фиксированной частотой на основе numpy.datetime64.
  • Для временных дельт или длительностей Pandas предоставляет тип Timedelta.

Наиболее фундаментальными из них являются объекты Timestamp и DatetimeIndex. Чаще используется функция pd.to_datetime().

Обычные последовательности: pd.date_range()

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

pd.date_range() for time stamps
pd.timedelta_range() for durations
pd.period_range()

Конечные примечания

Глава о пандах была огромной, и я не хотел вписывать сюда все. Для меня лучший способ сохранить и изучить все правильно — создать какой-нибудь проект с использованием Pandas.