У датафреймов ratings и movies есть общий столбец movieId. Значит, мы можем объединить эти датафреймы в одну таблицу. Используем метод merge:
joined = ratings.merge(movies, on='movieId', how='left')joined.head()
userId
movieId
rating
timestamp
title
genres
0
1
1
4.0
964982703
Toy Story (1995)
Adventure|Animation|Children|Comedy|Fantasy
1
1
3
4.0
964981247
Grumpier Old Men (1995)
Comedy|Romance
2
1
6
4.0
964982224
Heat (1995)
Action|Crime|Thriller
3
1
47
5.0
964983815
Seven (a.k.a. Se7en) (1995)
Mystery|Thriller
4
1
50
5.0
964982931
Usual Suspects, The (1995)
Crime|Mystery|Thriller
Схематично:
joined = left_df.merge(right_df, on='', how=''), где
left_df / right_df — датафреймы, которые мы объединяем. К “правому” датафрейму присоединяем “левый” (в нашем примере “левый” датафрейм — ratings, “правый” — movies).
how — параметр объединения записей. Он может иметь четыре значения: left, right, inner и outer. При значении left берем все записи (movieId) из “левого” датафрейма (ratings) и ищем их соответствия в “правом” (movies). В итоговом датафрейме останутся только те значения, которым были найдены соответствия, то есть только значения из ratings. Аналогично при параметре right остаются только значения из “правого” датафрейма. Если совпадений между таблицами нет, то ставим нулевое значение. Значение inner оставляет только те записи (movieId), которые есть в обоих датафреймах, outer объединяет все варианты movieId в обоих датафреймах.
on определяет, по какому столбцу происходит объединение. Для объединения по нескольким столбцам используйте on = ['col1', 'col2'] или left_on и right_on.
После объединения датафреймов лучше проверять, что не возникло дубликатов.
Убедимся в том, что число строк объединенного датафрейма совпадает с исходным:
len(ratings) ==len(joined)
True
Получаем значение True — значит, число строк совпадает.
Объединение датафреймов с помощью метода merge имеет особенности, аналогичные SQL JOIN. Если точнее, есть ситуации, которые приводят к дублированию строк в конечном результате. Разберем эти ситуации более подробно на примере небольших таблиц:
import pandas as pdurl ="https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/data/ratings_example.txt"ratings = pd.read_csv(url, sep='\t')ratings.head()
Итак, в датафрейме movies есть две строки с одним movieId. То есть теперь для таблицы ratings нет однозначного соответствия, с какой строкой она может объединиться с таблицей movies. В итоге строка с movieId = 31 будет дублирована:
ratings.merge(movies, how='left', on='movieId')
userId
movieId
rating
timestamp
title
genres
0
1
31
2.5
1260759144
Dangerous Minds (1995)
Drama
1
1
31
2.5
1260759144
Dangerous Minds (1995)
Drama
Если вы хотите избежать подобной ситуации, необходимо удалить дубликаты из таблицы movies. Для этого подходит метод drop_duplicates. В параметре subset указываем один или несколько столбцов, по комбинации которых хотим удалить дубликаты.
С помощью параметра keep указываем, какой из встречающихся дубликатов оставить (например, первый или последний). Параметр inplace указывает, что изменения нужно сохранить в датафрейме, к которому применяется метод (в нашем случае — в датафрейме movies):
Объедините получившиеся датафреймы по столбцу item_id с типом outer.
Определите, модель с каким item_id есть в статистике продаж purchase_df, но не учтена на складе (подсказка: подумайте, какой датафрейм должен быть “левым”, а какой “правым”, чтобы получить необходимые данные). Ответ в виде целого числа.
# code
Задание 2
Решите обратную задачу: модель с каким item_id есть на складе, но не имела ни одной продажи? Ответ в виде целого числа.
# code
Задание 3
Сформируйте датафрейм merged, в котором в результате объединения purchase_df и items_df останутся модели, которые учтены на складе и имели продажи. Сколько всего таких моделей?
# code
Задание 4
Посчитайте объем выручки для каждой модели, которую можно получить, распродав все остатки на складе. Модель с каким item_id имеет максимальное значение выручки после распродажи остатков? Ответ в виде целого числа.
Примечание: перемножение столбцов датафрейма можно производить разными способами, но самый простой - перемножение “в лоб” вида df['col1'] = df['col2'] * df['col3']. Для присоединения новых данных к датафрейму тоже можно использовать различные методы, включая функцию .append(), которая позволяет присоединять к датафрейму другой датафрейм, серии или словари.
# code
Задание 5
Посчитайте итоговую выручку из прошлого задания по всем моделям. Ответ в виде целого числа.