January 28, 2021

Изучение табличных данных на Python

От стадии загрузки данных (см. статью)  перейдем к их основательному изучению Двигаться будем от простого к  сложному и сначала разберемся со способами выборки нужных данных.  Напоминаю, что мы работаем с таблицей о поединках, организованных UFC в  период c ноября 1993 г. по июнь 2019 г., которая состоит из 5144 строк и  145 столбцов и имеет следующий вид:

Предположим, мы намерены анализировать столбец «weight_class» (весовая  категория). Выборка столбца в объекте DataFrame производится путем  указания его названия в квадратных скобках, если же их несколько, то  задается список имен:

Такую  выборку можно произвести альтернативным способом - путем удаления  ненужных столбцов (из двух предпочтителен тот, в котором требуется  меньше перечислений). Для этого можно воспользоваться методом DataFrame drop(список столбцов, axis=ось),  указав список имен столбцов. Также предусмотрена возможность задания  оси удаления, так как этот метод позволяет аналогичным образом удалять и  строки (0 для строк, 1 для столбцов).

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

Данные  способы выборки элементов являются немного запутанными, так как при  перечислении имен в скобках адресуются столбцы, в то время как  целочисленные значения подразумевают обращение к строкам. Вместе с тем у  объекта DataFrame имена могут быть заданы как для столбцов, так и  строк. Аналогично неявные порядковые номера имеют не только строки, но и  столбцы.

С  учетом этого в pandas предусмотрена возможность адресации объектов  DataFrame с явным указанием типа выборки. Для этого предназначены  атрибуты-индексаторы loc (для обращения по именам) и iloc  (по порядковым номерам). Отличием синтаксиса является адресация  интересуемых значений сначала по строкам, потом по столбцам через  запятую. То есть для получения столбца «weight_class» придется ввести battles_df.loc[:,'weight_class'] («:» означает все строки).

Посредством индексатора loc  можно задавать более гибкие запросы, например, с указанием условий  фильтрации строк. Вот как получить список бойцов из красного угла  («R_fighter») категории тяжелого веса, принимавших участие в одном из  поединков.

Атрибуты-индексаторы  понимают и сложные условия выборки (например, их можно связывать через  оператор И - & ). Вот как выбрать чемпионские поединки  (title_bout=True), проходившие в весовой категории «Catch Weight»:

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

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

К  группам можно применять и собственные функции, например, возвращающие  обработанный специальным образом объект DataFrame/ Series. В частности,  можно сгруппировать поединки по весам и для каждого вывести столбец с  судьями, наиболее часто обслуживавшими соответствующий вес:

Объекты Series можно преобразовывать в списки и словари, посредством вызова методов  tolist и to_dict.  Например, один из способов формирования перечня имен тяжеловесов  заключается в выполнении двух последовательных запросов для получения  столбцов тяжеловесов, выступавших в красном и синем углах,  преобразовании их в списки, а затем объединении их в множество  (дубликаты автоматически будут устранены):

Аналогичные  действия можно выполнить только средствами pandas. Для этого можно  конкатенировать (склеить) оба столбца при помощи функции concat и устранить дубликаты вызовом метода drop_duplicates:

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Instagram

Яндекс Дзен

Telegram