February 4, 2021

Работа с данными с нуля

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

Создание таблицы из имеющихся данных

Как правило, библиотека Pandas импортируется под псевдонимом pd (import pandas as pd).  Для создания табличного объекта (DataFrame) из имеющихся сведений  вызывают его конструктор. Последний поддерживает разный набор  параметров, наиболее распространенные из которых - двумерные массивы  numpy, списки списков, а также словари списков, массивов numpy,  кортежей, объектов Series (объект Pandas, задающий только одну колонку в  отличие от DataFrame).

Приведем пример создания DataFrame из словаря списков:

df = pd.DataFrame({'name':['A','B','C','D'], 'value':[1,2,4,10]})

Заметим, что ключи словаря стали названиями колонок, чтобы изменить индекс, адресующий строки, можно добавить аргумент index:

df = pd.DataFrame({'name':['A','B','C','D'], 'value':[1,2,4,10]}, index=['row1','row2','row3','row4'])

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

df = pd.DataFrame([['A',1],['B',2],['C',4],['D',10]], index=['row1','row2','row3','row4'], columns=['name', 'value'])

Создание таблицы из внешних данных

Для создания DataFrame из внешних данных предназначен ряд функций библиотеки Pandas, начинающихся с pd.read_...

Наиболее  распространенной среди них является чтение из текстового файла с  разделителями pd.read_csv,  для которой в качестве параметров задается имя файла, разделитель и ряд других:

df = pd.read_csv('data.csv', sep=',')

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

Для  выборки информации по порядковым номерам столбцов и строк корректнее  всего использовать свойство DataFrame iloc, требующее через запятую  перечислить номера строк и столбцов. Например, для сохранения первых 15  строк и только 1 и 2 колонки (внутренний порядок с нуля, поэтому индексы  на 1 меньше) нужно задать:

df.iloc[:15,[0,1]]

а для сохранения всех строк, кроме 1 и 2, и только 3 и 4 колонки:

df.drop([0,1],axis=0).iloc[:,[2,3]]

Для  задания номеров строк и столбцов можно использовать, как синтаксис  списков ([1,2]), так и их срезов  (:15 - от 0 до 14 включительно). Во  втором случае мы сначала вызываем метод drop, удаляющий заданные номера  по первой оси (оси строк, axis=0), а затем отбирающий все строки и 3, 4  колонки.

Выборка данных по условиям

Отбор по условиям можно осуществить несколькими способами, например, посредством обращения к свойству loc объекта DataFrame.

Так, для отбора из df наблюдений, в столбце value которых содержаться  значения большие 2, а столбце name - равные   'A' можно задать: df.loc[(df.value>2) & (df.name=='A') ]

Альтернативным образом это можно сделать посредством вызова метода query:

df.query('value>2 & name=="A"')

Следует  отметить, что второй вариант был разработан для оптимизации  употребления памяти при работе с большими данными. Однако, как  следствие, этот метод работает медленнее.

Выборка данных по именам столбцов и строк

Для  этого предназначен метод filter объекта DataFrame. Для примера отберем  из следующего объекта df строки, соответствующие сотрудникам из первого  отдела:

df.filter(like='Dep1',axis=0)

  • Аргумент like отбирает те метки, где встречается заданное значение
  • Аргумент axis отвечает за ось - индекс или колонки
  • Аргумент regex отбирает лэйблы, подходящие к переданному паттерну
  • Аргумент items задает список для отбора меток

Преобразование данных

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

Пусть мы работаем со следующей таблицей my_stat:

Чтобы добавить новые столбцы  V5 = V1 + V4 и V6 = натуральный логарифм переменной V2, можно выполнить команду:

my_stat = my_stat.assign(V5=my_stat.V1+my_stat.V4,V6=np.log(my_stat.V2))

Также можно по отдельности вызвать:

my_stat['V5'] = my_stat['V1'] + my_stat['V4'] 

my_stat['V6'] = np.log(my_stat['V2']) 

Переименование колонок и индексов

Для  переименования названий столбцов в вышеуказанном примере можно пойти  разными путями. Например, обратиться к свойству columns:

df.columns  = ['session_value', 'group', 'time', 'n_users']

Кроме того, можно вызвать метод rename:

my_stat.rename(inplace=True,columns={"V1": "session_value", "V2": "group", 'V3':'time','V4':'n_users'})

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

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

Для определения незаполненных значений используются методы isnull, notnull,   возвращающие True/False для каждого объекта (обычно значение в столбце или элемент в строке) в зависимости от присутствия в нем пропущенных значений подробнее здесь). Например, такой командой можно отобразить незаполненные значения в столбце  session_value датафрейма my_stat:

my_stat[my_stat['session_value'].isnull()]

Заполнить пропущенные значения заданным (например, 0) можно с помощью метода fillna:

my_stat['session_value'].fillna(0, inplace=True)

Если  какие-то значения нашей таблицы являются нерелевантными, их можно  заменить, в том числе некоторыми метриками на основе имеющихся данных.  Например, все отрицательные значения в колонке n_users заменим на  медианное значение по данному столбцу (без учета отрицательных  значений):

my_stat.loc[my_stat.n_users<0,['n_users']] = int(my_stat.loc[my_stat.n_users>=0,['n_users']].median())

Групповые операции

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

Например, рассчитаем среднее значение колонки session_value для каждой группы  (столбец group). Кроме того, переименуем колонку со средним значением  session_value в mean_session_value:

mean_session_value_data  = my_stat.groupby('group',  as_index=False).aggregate({'session_value':'mean'}).rename(columns={'session_value':'mean_session_value'})