Изучение табличных данных на 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:
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: