Таблица, которую мы получили, хранится в структуре данных DataFrame. Давайте подробно разберём, из чего состоит этот объект и какие операции с ним можно выполнять. image DataFrame — это двумерная структура данных Pandas, где у каждого элемента есть две координаты: по строке и по столбцу. image Вы видите две оси, которые формируют объект DataFrame. Первая ось называется индексы, вторая ось — столбцы. По умолчанию индексация в DataFrame начинается с нуля. Каждая строка — это одно наблюдение, запись об объекте исследования. А столбцы — признаки объектов. В нашем случае одна строка — это одно действие одного пользователя. Прослушивание такой-то композиции в исполнении такой-то группы в течение такого-то времени. Для лучшего понимания данных полезно получить доступ к их описанию. Это либо документация со сведениями о содержании каждого столбца, либо – не самый лучший вариант – рассказ человека, который предоставил вам эту информацию. Сейчас документация выглядит так: user_id — содержит информацию об уникальном идентификаторе пользователя; total play — сколько секунд пользователь слушал трек; Artist — имя исполнителя; genre — жанр (рок, поп, электронная музыка, классическая и др.); track — название трека. Такое описание поможет нам ставить себе корректные задачи. У DataFrame есть неотъемлемые свойства, значения которых можно запросить. Они называются атрибуты. Например, атрибут columns содержит информацию о названиях столбцов в наборе данных. print(df.columns) image В данном случае атрибут columns вернул список названий столбцов и сообщил, что каждое из них имеет тип данных object. Вообще типы данных могут быть разные. Для просмотра типа данных каждого столбца лучше всего использовать атрибут dtypes. print(df.dtypes) image Типы данных, о которых сообщают нам атрибуты — это типы данных библиотеки Pandas. Каждому из них соответствует определённый тип данных языка Python. Так, для int таким «двойником» в Pandas будет int64. Тип данных object используется, когда данные не подходят ни под одну категорию или соответствуют в Python типу «строка». Вот таблица соответствия типов данных Pandas и Python: PANDAS DTYPE PYTHON TYPE ЗНАЧЕНИЕ object str Строка int64 int Целые числа float64 float Вещественные числа bool bool Логический тип данных О размерах таблицы с данными сообщает её атрибут shape. В результате получается кортеж (неизменяемый список) из двух чисел: первое – количество строк, второе – количество столбцов. print(df.shape) image В таблице 67963 строк (наблюдений) и 5 столбцов. Кортеж – одномерная неизменяемая последовательность. Это структура данных, похожая на список, её тоже можно сохранять в переменной. Например, кортеж artist содержит имена исполнителей: artist = ('Queen', 'Led Zeppelin', 'Scorpions') Но если мы попытаемся изменить элемент кортежа, то Python вернёт ошибку: artist[0] = 'Spice Girls' --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 artist[0] = 'Spice Girls' TypeError: 'tuple' object does not support item assignment Можно получить информацию как обо всём кортеже, так и об отдельных его элементах: print(artist) ('Queen', 'Led Zeppelin', 'Scorpions') print(artist[0]) 'Queen' Кортеж нужен для хранения и чтения данных, которые лучше не изменять. Он похож на текстовый документ, защищённый от редактирования. Всю информацию, которую предоставляют разные атрибуты DataFrame, можно получить вызовом одного-единственного метода info(). Изучив результаты, которые этот метод возвращает, аналитик выбирает тактику дальнейшей работы с таблицей. df.info() RangeIndex: 67963 entries, 0 to 67962 Data columns (total 5 columns): user_id 67963 non-null object total play 67963 non-null float64 Artist 60157 non-null object genre 65223 non-null object track 65368 non-null object dtypes: float64(1), object(4) memory usage: 2.6+ MB image Например, здесь в разных столбцах разное количество элементов с определёнными значениями (non-null). Следовательно, в таблице есть пропущенные значения (null). Прежде чем анализировать такие данные, их нужно обработать. Это одна из самых интересных задач аналитика, и мы поговорим о ней подробнее в следующей теме. TASK_1_4 Прочитайте файл music_log.csv и сохраните его в переменной df. Создайте переменную shape_table и сохраните в ней размеры таблицы music_log.csv. Напечатайте на экране размер таблицы в таком виде: Размер таблицы: ... SOLUTION import pandas as pd df=pd.read_csv('music_log.csv') shape_table=df.shape print('Размер таблицы:', shape_table) TASK_2_4 Сколько наблюдений в наборе данных? В переменной shape_table хранится кортеж. Его первый элемент — количество наблюдений, который надо сохранить в переменной observations_table (не забывайте, что индексация элементов идёт с 0). Напечатайте на экране ответ в таком виде: Количество наблюдений: ... SOLUTION import pandas as pd df = pd.read_csv('music_log.csv') shape_table = df.shape observations_table = shape_table [0] print('Количество наблюдений:', observations_table) TASK_3_4 Найдите в информации, которую вернул метод info(), число наблюдений. Вручную присвойте это число как значение переменной observations_info_table. SOLUTION import pandas as pd df = pd.read_csv('music_log.csv') df.info() observations_info_table = 67963 TASK_4_4 Вы ещё не запутались? Давайте осмотримся и заодно вспомним условные конструкции. Поскольку в ходе работы аналитик объявляет разные переменные и сохраняет в них добытую разными способами информацию, запутаться очень легко. Именно поэтому необходимо проверять себя и текущие результаты. Сравните полученные результаты в переменных observations_info_table и observations_table. Если значения переменных совпадают, то выведите количество наблюдений и сообщение: "Решение верно, количество наблюдений равно", observations_table Если значения переменных не совпадают, то выведите сообщение: "Решение неверно, проверьте ещё раз!" SOLUTION import pandas as pd df = pd.read_csv('music_log.csv') observations_info_table = df.shape[0] observations_table = 67963 if observations_info_table == observations_table: print("Решение верно, количество наблюдений равно", observations_table) else: print("Решение неверно, проверьте ещё раз!", observations_table)