Следующая тема: ПД. Категоризация данных

Вернуться к разделу: "Предобработка данных"

Вернуться в оглавление: Я.Практикум

1.Введение

Дубликаты — самые неожиданные проблемы в данных. В первом курсе вы уже встречали методы duplicated() и drop_duplicates(), но они избавляют лишь от полных дубликатов.

Чему вы научитесь

Изучите способы ручного поиска дубликатов; Узнаете, как обрабатывать дубликаты с учётом регистра.

Сколько времени это займет:

3 урока от 15 до 25 минут

Постановка задачи:

Ответ на задачу по поисковой оптимизации принёс не только прямую, но и косвенную пользу. Менеджмент по подключению новых партнёров обеспокоен маленьким трафиком по категории «Телефоны». Ведь это большой рынок и сервис теряет потенциальных пользователей. Вас попросили изучить товары и магазины в категории «Телефоны». Нужно определить, по какой марке телефона не хватает предложений на Маркете.

2.Ручной поиск дубликатов

Вы уже работали с дубликатами в курсе «Базовый Python». Напомним несколько определений:

  • Строки-дубликаты — это строки (записи) датафрейма с одинаковыми значениями в одних и тех же столбцах.
  • Дубликаты в столбце — это одинаковые значения в столбце датафрейма.
Дубликаты в строках и столбцах

Дубликаты можно искать двумя способами:

Способ первый. Вы уже изучали метод duplicated(). В сочетании с методом sum() он возвращает количество дубликатов: df.duplicated().sum() или df['название столбца'].duplicated().sum().

Напомним, что если вызвать метод duplicated() без подсчёта суммы, то на экране будут отображены все строки. Там, где есть дубликаты, будет логическое значение True, где дубликата нет — False. Метод sum() воспринимает все значения True как единицы, поэтому происходит сложение всех единиц, то есть находится количество дубликатов.

Способ второй. Вызвать метод value_counts(), который анализирует столбец, выбирает каждое уникальное значение и подсчитывает частоту его встречаемости в списке. Применяют метод к объекту с типом Series, то есть к столбцу датафрейма. Результат его работы — список пар «значение-частота», отсортированных по убыванию встречаемости. Все дубликаты, которые встречаются чаще других, оказываются в начале результата.

Удалять явные дубликаты в строках и столбцах можно с помощью метода drop_duplicates(). У него есть параметры subset и keep. В subset передаётся список с названиями столбцов, в которых нужно искать явные дубликаты. Рассмотрим на нескольких примерах:

  • В subset передают список с названием одного столбца: дубликатами будут признаны строки таблицы с повторами только в этом столбце.
  • В subset передают список с названиями двух столбцов: дубликатами будут строки с одинаковыми значениями только в этих двух столбцах.

И так далее в порядке возрастания. Обратимся к датафрейму с наличием продуктов питания на складе:

import pandas as pd

df = pd.DataFrame({
    'name': ['Сырок Мечта', 'Молоко Отличное', 'Сырок Мечта', 'Сырок Дружба',\
             'Сырок Дружба', 'Молоко Вкусное'],
    'count': [120, 200, 125, 100, 35, 500]
})

print(df.head())
name
Сырок Мечта        2
Сырок Дружба       2
Молоко Отличное    1
Молоко Вкусное     1
Name: count, dtype: int64

Итак, повторяются сырок «Мечта» и сырок «Дружба». Из-за этого получается, что информация о количестве товара недостоверна. Когда данных очень много — это легко не заметить и сложно обработать вручную.

Найдём общее количество сырков «Мечта» на складе. Для этого отфильтруем строки таблицы, у которых в столбце name записано Сырок Мечта, выберем столбец с количеством count и найдём сумму методом sum():

import pandas as pd

df = pd.DataFrame({
    'name': ['Сырок Мечта', 'Молоко Отличное', 'Сырок Мечта', 'Сырок Дружба',\
             'Сырок Дружба', 'Молоко Вкусное'],
    'count': [120, 200, 125, 100, 35, 500]
})

mechta = df[df['name'] == 'Сырок Мечта']['count'].sum()
print(mechta)

3.Лаборатория ручного поиска дубликатов

Купи слона смартфон

Перейдём к новым данным о продажах смартфонов. Вам нужно узнать, сколько разных магазинов уже торгуют телефонами определённых моделей на сайте Яндекс Маркет.

Уже знакомым методом read_excel() прочитаем Excel-таблицу со списком товаров и сохраним в переменной stock:

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
print(stock.head())
\ id item count
0 100480924 Смартфон Xiaomi Redmi 6A 16GB 32
1 100480929 Смартфон Xiaomi Redmi 6A 16GB 10
2 100480938 Смартфон Samsung Galaxy A30 32GB 49
3 100480952 смартфон Samsung Galaxy A30 32gb 11
4 100480959 Смартфон HUAWEI P30 lite 5

В таблице учёта:

  • столбец id с идентификаторами товаров;
  • столбец item с полными названиями моделей;
  • столбец count, где посчитано количество смартфонов конкретной модели в продаже.

Задача №1

Уже в первых двух строках встречаем дубликат: названия моделей абсолютно одинаковы, а id — разные. Получается, что таблица учёта даёт неверное представление о количестве смартфонов Xiaomi Redmi 6A 16GB: их не 32 и не 10, а целых 42! Что, если такие повторы встречаются в таблице и дальше и самих дубликатов больше? Хорошо бы проанализировать сразу весь набор данных, а не просматривать каждую строку.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
# ваш код здесь
print (stock.duplicated('item').sum())

3

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

Задача №2

Примените метод value_counts() к столбцу item датафрейма stock. Результат выведите на экран.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
print (stock.value_counts('item'))

item
Смартфон Xiaomi Redmi 6A 16GB       3
Смартфон HUAWEI P30 lite            2
Смартфон Apple iPhone Xr 64GB       1
Смартфон Apple iPhone Xr 64gb       1
Смартфон Honor 8X 64GB              1
Смартфон Samsung Galaxy A30 32GB    1
смартфон Samsung Galaxy A30 32gb    1
dtype: int64

Час от часу не легче. Ладно Xiaomi... Но ведь и HUAWEI туда же!

Задача №3

Начните собирать данные для новой таблицы уже без дубликатов. Посчитайте количество телефонов Xiaomi Redmi — Смартфон Xiaomi Redmi 6A 16GB— на складе и сохраните его в переменной xiaomi. Используйте логическую индексацию и отфильтруйте строки датафрейма, выбор столбца count и метод sum() для столбца. Результат выведите на экран.

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

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
# подсчитайте количество телефонов Xiaomi Redmi
xiaomi = stock[stock['item']=='Смартфон Xiaomi Redmi 6A 16GB']['count'].sum()
# выведите значение xiaomi на экран
print (xiaomi)

44

На складе всего 44 смартфона Xiaomi. А что же с HUAWEI?

Задача №4

Аналогичным образом найдите количество смартфонов HUAWEI (это Смартфон HUAWEI P30 lite) и сохраните его в переменной huawei. Результат выведите на экран.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')

xiaomi = stock[stock['item'] == 'Смартфон Xiaomi Redmi 6A 16GB']['count'].sum()
 # напишите ваш код здесь
huawei = stock[stock['item'] == 'Смартфон HUAWEI P30 lite']['count'].sum()
# выведите значение переменной huawei на экран
print (huawei)

38

На складе 38 смартфонов HUAWEI. Хм, это немного меньше, чем у Xiaomi…

Задача №5

«Перезапишите» stock и удалите из самого датафрейма строки с дубликатами в столбце item, оставив только первые вхождения: будем считать, что верные идентификаторы товаров для «дубликатов» встречаются первыми в таблице. Решая задание, используйте метод для удаления дубликатов. Когда будете выполнять операцию, не забудьте про параметры subset и keep. После не сбрасывайте индексы и выведите на экран всю таблицу.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')

xiaomi = stock[stock['item'] == 'Смартфон Xiaomi Redmi 6A 16GB']['count'].sum()
huawei = stock[stock['item'] == 'Смартфон HUAWEI P30 lite']['count'].sum()
# удалите строки с дубликатами в столбце 'item'
stock = stock.drop_duplicates(subset=['item'], keep='first')
# выведите всю таблицу stock на экран
print (stock)

          id                              item  count
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     32
2  100480938  Смартфон Samsung Galaxy A30 32GB     49
3  100480952  смартфон Samsung Galaxy A30 32gb     11
4  100480959          Смартфон HUAWEI P30 lite      5
5  100480975     Смартфон Apple iPhone Xr 64gb     10
6  100480988            Смартфон Honor 8X 64GB     64
9  100481020     Смартфон Apple iPhone Xr 64GB     19

Дубликатов больше нет.

Задача №6

В столбце item сбилась нумерация после того, как в нём удалили строки с дубликатами. Допустим, в этом случае в номерах строк нет особого смысла — мы хотим восстановить нумерацию путём сброса пропусков в ней. Восстановите индексы строк методом reset_index() c параметром drop, равным True. Выведите на экран таблицу.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')

xiaomi = stock[stock['item'] == 'Смартфон Xiaomi Redmi 6A 16GB']['count'].sum()
huawei = stock[stock['item'] == 'Смартфон HUAWEI P30 lite']['count'].sum()

stock = stock.drop_duplicates(subset=['item'], keep='first')
# восстановите индексы с помощью reset_index(drop=True)
stock = stock.reset_index(drop=True)
# выведите stock на экран
print (stock)

          id                              item  count
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     32
1  100480938  Смартфон Samsung Galaxy A30 32GB     49
2  100480952  смартфон Samsung Galaxy A30 32gb     11
3  100480959          Смартфон HUAWEI P30 lite      5
4  100480975     Смартфон Apple iPhone Xr 64gb     10
5  100480988            Смартфон Honor 8X 64GB     64
6  100481020     Смартфон Apple iPhone Xr 64GB     19

Отлично, номера строк восстановлены!

Задача №7

Вернитесь к столбцу count в датафрейме stock . Из нулевой строки и столбца запишите в ячейку с количеством телефонов Xiaomi Redmi 6A 16GB обновлённое количество телефонов Xiaomi. Ранее вы сохранили это значение в переменной xiaomi. Выведите таблицу stock на экран и изучите результат.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
xiaomi = stock[stock['item'] == 'Смартфон Xiaomi Redmi 6A 16GB']['count'].sum()
huawei = stock[stock['item'] == 'Смартфон HUAWEI P30 lite']['count'].sum()

stock = stock.drop_duplicates(subset=['item'], keep='first')
stock = stock.reset_index(drop=True)
# замените значение в ячейке с количеством смартфонов Xiaomi
stock.loc[0,'count'] = xiaomi
# выведите таблицу stock на экран
print (stock)

          id                              item  count
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     44
1  100480938  Смартфон Samsung Galaxy A30 32GB     49
2  100480952  смартфон Samsung Galaxy A30 32gb     11
3  100480959          Смартфон HUAWEI P30 lite      5
4  100480975     Смартфон Apple iPhone Xr 64gb     10
5  100480988            Смартфон Honor 8X 64GB     64
6  100481020     Смартфон Apple iPhone Xr 64GB     19

Сейчас вы сохранили количество всех Xiaomi заранее, чтобы не потерять при удалении дубликатов. У вас отлично получается думать наперёд!

Задача №8

Аналогично прошлому заданию обратитесь к третьей строке столбца count и запишите в ячейку с количеством телефонов HUAWEI P30 lite обновлённое количество телефонов Huawei. Ранее сохранили это значение в переменной huawei.

Выведите таблицу stock на экран и изучите результат.

import pandas as pd

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
xiaomi = stock[stock['item'] == 'Смартфон Xiaomi Redmi 6A 16GB']['count'].sum()
huawei = stock[stock['item'] == 'Смартфон HUAWEI P30 lite']['count'].sum()

stock = stock.drop_duplicates(subset=['item'], keep='first')
stock = stock.reset_index(drop=True)

stock.loc[0, 'count'] = xiaomi
# замените значение в ячейке с количеством смартфонов Huawei
stock.loc[3, 'count'] = huawei
# выведите таблицу stock на экран
print (stock)

         id                              item  count
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     44
1  100480938  Смартфон Samsung Galaxy A30 32GB     49
2  100480952  смартфон Samsung Galaxy A30 32gb     11
3  100480959          Смартфон HUAWEI P30 lite     38
4  100480975     Смартфон Apple iPhone Xr 64gb     10
5  100480988            Смартфон Honor 8X 64GB     64
6  100481020     Смартфон Apple iPhone Xr 64GB     19

Вы избавились от дубликатов в смартфонах HUAWEI и Xiaomi. Отлично сработано! Теперь можно двигаться дальше.

Чтобы решить задачу, можно также использовать группировку (groupby) и методы вроде sum() и count(). Но тогда вам понадобился бы навык объединения нескольких таблиц в одну.

4.Ручной поиск дубликатов с учётом регистра

В прошлом уроке был упущен ещё один вариант дублей. Попробуйте отыскать его в выводе метода value_counts():
 
print(stock['item'].value_counts())
смартфон Samsung Galaxy A30 32gb    1
Смартфон Apple iPhone Xr 64GB       1
Смартфон Honor 8X 64GB              1
Смартфон Samsung Galaxy A30 32GB    1
Смартфон HUAWEI P30 lite            1
Смартфон Xiaomi Redmi 6A 16GB       1
Смартфон Apple iPhone Xr 64gb       1
Name: item, dtype: int64
 
Строка Смартфон Samsung Galaxy A30 32GB и строка смартфон Samsung Galaxy A30 32gb различаются регистром нескольких букв. В одной строке некоторые символы в нижнем регистре, а в другой — в верхнем. Чтобы учесть такие дубликаты, все символы в строках приводят к нижнему регистру вызовом метода lower():
giraffe_height = 'жираф БОЛЬШОЙ, ему ВИДНЕЙ'
print(giraffe_height.lower())
жираф большой, ему видней
В pandas столбец (Series) к нижнему регистру приводит метод с похожим синтаксисом: str.lower().
import pandas as pd

registers = pd.Series(['Нервы — ', 
                       'БОЛЬШИЕ,', 
                       'маленькие,',
                       'многие! —',
                       'скачут БеШеНыЕ,',
                       'и уже', 
                       'у нервов ПОДКАшиваются ноги!'])
registers.str.lower() 
0                        нервы — 
1                        большие,
2                      маленькие,
3                       многие! —
4                 скачут бешеные,
5                           и уже
6    у нервов подкашиваются ноги!
dtype: object
Таким образом, каждая строка в столбце приводится к нижнему регистру. Помните, что если вы хотите изменить столбец в исходном датафрейме, то его нужно перезаписать:
df['название_столбца'] = df['название_столбца'].str.lower()
# Или создать новый столбец:
df['новый_столбец'] = df['старый_столбец'].str.lower() 
 
Задание №1
 
Переведите названия моделей в нижний регистр методом str.lower(). Сохраните их в новом столбце item_lowercase и напечатайте обновлённую таблицу на экране.
import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
# сохраните здесь список названий моделей в нижнем регистре
stock['item_lowercase'] = stock['item'].str.lower()
# выведите таблицу stock на экран
print (stock)
                     item_lowercase  
0     смартфон xiaomi redmi 6a 16gb  
1     смартфон xiaomi redmi 6a 16gb  
2  смартфон samsung galaxy a30 32gb  
3  смартфон samsung galaxy a30 32gb  
4          смартфон huawei p30 lite  
5     смартфон apple iphone xr 64gb  
6            смартфон honor 8x 64gb  
7          смартфон huawei p30 lite  
8     смартфон xiaomi redmi 6a 16gb  
9     смартфон apple iphone xr 64gb
 
Задание №2
 
В столбце item_lowercase посчитайте количество дублей методом value_counts() для каждой модели телефона из столбца item_lowercase. Выведите результат на экран.
import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
stock['item_lowercase'] = stock['item'].str.lower() 
print (stock['item_lowercase'].value_counts())

Результат
смартфон xiaomi redmi 6a 16gb       3
смартфон samsung galaxy a30 32gb    2
смартфон apple iphone xr 64gb       2
смартфон huawei p30 lite            2
смартфон honor 8x 64gb              1
Name: item_lowercase, dtype: int64

Вы перевели все названия в нижний регистр и обнаружили дубликат не только у Samsung Galaxy, но и у Apple iPhone. Это значит, что все модели смартфонов проверены на дубли. Результат можно смело передать управляющему.

Задание №3

Сохраните количество телефонов Apple из строки смартфон apple iphone xr 64gb в переменной apple. Выведите значение apple на экран.

import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx')

stock['item_lowercase'] = stock['item'].str.lower()
# сохраните количество телефонов Apple
apple = stock[stock['item_lowercase']=='смартфон apple iphone xr 64gb']['count'].sum()
# выведите значение apple на экран
print (apple)
Apple = 29. Вам как: смартфонами или яблоками?
 
Задание №4
 
Сохраните количество телефонов Samsung из строки смартфон samsung galaxy a30 32gb в переменной samsung. Выведите значение samsung на экран.
import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx')
stock['item_lowercase'] = stock['item'].str.lower()

apple = stock[stock['item_lowercase'] == 'смартфон apple iphone xr 64gb']['count'].sum()
# сохраните количество телефонов samsung
samsung = stock[stock['item_lowercase'] == 'смартфон samsung galaxy a30 32gb']['count'].sum()
# выведите значение samsung на экран
print (samsung)

Результат
60

Вы уже считали Xiaomi, HUAWEI, Apple. Вот и до Samsung очередь дошла.

Задание №5

«Перезапишите» stock и удалите из самого датафрейма строки с дубликатами в столбце item_lowercase, оставив только первые вхождения: будем считать, что верные идентификаторы товаров для «дубликатов» встречаются первыми в таблице. Решая задание, используйте метод pandas. Когда будете выполнять операцию, не забудьте про параметры subset и keep. После не сбрасывайте индексы и выведите на экран всю таблицу.

import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx')
stock['item_lowercase'] = stock['item'].str.lower()

apple = stock[stock['item_lowercase'] == 'смартфон apple iphone xr 64gb']['count'].sum()
samsung = stock[stock['item_lowercase'] == 'смартфон samsung galaxy a30 32gb']['count'].sum()
# удалите дубликаты
stock = stock.drop_duplicates(subset=['item_lowercase'], keep='first')
# выведите таблицу stock на экран
print (stock)

Результат
          id                              item  count  \
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     32   
2  100480938  Смартфон Samsung Galaxy A30 32GB     49   
4  100480959          Смартфон HUAWEI P30 lite      5   
5  100480975     Смартфон Apple iPhone Xr 64gb     10   
6  100480988            Смартфон Honor 8X 64GB     64   

                     item_lowercase  
0     смартфон xiaomi redmi 6a 16gb  
2  смартфон samsung galaxy a30 32gb  
4          смартфон huawei p30 lite  
5     смартфон apple iphone xr 64gb  
6            смартфон honor 8x 64gb

Вам этот порядок действий ничего не напоминает? Точно так же вы поступили с дубликатами в прошлом уроке. Только сейчас вы работаете со столбцом item_lowercase, а не item.

Задание №6

В столбце item_lowercase сбилась нумерация после того, как в нём удалили строки с дубликатами. Допустим, в этом случае в номерах строк нет особого смысла — мы хотим восстановить нумерацию путём сброса пропусков в ней. Восстановите индексы строк методом reset_index() c параметром drop, равным True. Выведите на экран таблицу.

import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
stock['item_lowercase'] = stock['item'].str.lower()

apple = stock[stock['item_lowercase'] == 'смартфон apple iphone xr 64gb']['count'].sum()
samsung = stock[stock['item_lowercase'] == 'смартфон samsung galaxy a30 32gb']['count'].sum()

stock = stock.drop_duplicates(subset=['item_lowercase'], keep='first')
# сбросьте индексы
stock = stock.reset_index(drop=True)
# выведите таблицу stock на экран
print (stock)

Результат
          id                              item  count  \
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     32   
1  100480938  Смартфон Samsung Galaxy A30 32GB     49   
2  100480959          Смартфон HUAWEI P30 lite      5   
3  100480975     Смартфон Apple iPhone Xr 64gb     10   
4  100480988            Смартфон Honor 8X 64GB     64   

                     item_lowercase  
0     смартфон xiaomi redmi 6a 16gb  
1  смартфон samsung galaxy a30 32gb  
2          смартфон huawei p30 lite  
3     смартфон apple iphone xr 64gb  
4            смартфон honor 8x 64gb

Отлично, номера строк восстановлены!

Задание №7

Замените количество телефонов Apple в ячейке таблицы — значение в столбце count — на переменную apple с помощью атрибута loc[]. Распечатайте таблицу stock на экране.

import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
stock['item_lowercase'] = stock['item'].str.lower()
apple = stock[stock['item_lowercase'] == 'смартфон apple iphone xr 64gb']['count'].sum()
samsung = stock[stock['item_lowercase'] == 'смартфон samsung galaxy a30 32gb']['count'].sum()
stock = stock.drop_duplicates(subset=['item_lowercase'], keep='first')
stock = stock.reset_index(drop=True)
# запишите новое количество телефонов Apple в ячейку таблицы
stock.loc[3,'count'] = apple
# выведите таблицу stock на экран
print (stock)

          id                              item  count  \
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     32   
1  100480938  Смартфон Samsung Galaxy A30 32GB     49   
2  100480959          Смартфон HUAWEI P30 lite      5   
3  100480975     Смартфон Apple iPhone Xr 64gb     29   
4  100480988            Смартфон Honor 8X 64GB     64   

                     item_lowercase  
0     смартфон xiaomi redmi 6a 16gb  
1  смартфон samsung galaxy a30 32gb  
2          смартфон huawei p30 lite  
3     смартфон apple iphone xr 64gb  
4            смартфон honor 8x 64gb

Теперь все яблоки на своих местах.

Задание №8

Замените количество телефонов Samsung в таблице — значение в столбце count — на значение переменной samsung. Распечатайте таблицу stock на экране.

import pandas as pd

# служебная строка для печати всех столбцов таблицы на экран
pd.set_option('display.max_columns', None)

stock = pd.read_excel('/datasets/stock.xlsx', sheet_name='storehouse')
stock['item_lowercase'] = stock['item'].str.lower()

apple = stock[stock['item_lowercase'] == 'смартфон apple iphone xr 64gb']['count'].sum()
samsung = stock[stock['item_lowercase'] == 'смартфон samsung galaxy a30 32gb']['count'].sum()

stock = stock.drop_duplicates(subset=['item_lowercase'], keep='first')
stock = stock.reset_index(drop=True)

stock.loc[3, 'count'] = apple
# запишите новое количество телефонов Samsung в ячейку таблицы
stock.loc[1, 'count'] = samsung
# выведите таблицу stock на экран
print (stock)

Результат
          id                              item  count  \
0  100480924     Смартфон Xiaomi Redmi 6A 16GB     32   
1  100480938  Смартфон Samsung Galaxy A30 32GB     60   
2  100480959          Смартфон HUAWEI P30 lite      5   
3  100480975     Смартфон Apple iPhone Xr 64gb     29   
4  100480988            Смартфон Honor 8X 64GB     64   

                     item_lowercase  
0     смартфон xiaomi redmi 6a 16gb  
1  смартфон samsung galaxy a30 32gb  
2          смартфон huawei p30 lite  
3     смартфон apple iphone xr 64gb  
4            смартфон honor 8x 64gb

Чем хорош процесс избавления от дубликатов? Тем, что любые дубликаты однажды заканчиваются.

5.Заключение

Вы изучили товары и магазины в категории «Телефоны». Определили, что в Яндекс Маркете очень мало точек продаж, где можно купить Apple iPhone. Всего 29 — против 69 магазинов с телефонами фирмы Honor. Чем больше магазинов, тем больше покупок: пользователь быстрее найдёт то, что нужно.

Перед тем как рекомендовать Яндекс.Маркету продавать больше iPhone, следовало бы проанализировать пользовательские запросы. Ведь помимо количества магазинов нужны доказательства, что пользователям действительно интересны определённые модели.

Забери с собой

Чтобы ничего не забыть, скачайте шпаргалку и конспект темы.

Где ещё почитать про работу с дубликатами

Более сложные алгоритмы поиска дубликатов в текстах и изображениях

6.Проверочные задания. Поиск дубликатов

Чтобы пройти тест нужно правильно ответить на 3 вопроса из 5. Время на прохождение: 10 минут

Задание 1 из 5
Данные записаны в объект Series с именем data. Среди значений встречаются дубликаты, и некоторые из них отличаются только форматированием. Какой код найдёт все повторы и неявные дубликаты? 
0    APPLE 1000 ML
1     Apple 750 ml
2    Apple 1000 Ml
3    Apple 1000 ml
4    Apple 1000 ml
dtype: object 

Правильный ответ
data.str.lower().duplicated()

Если не предобработать данные, метод duplicated() найдёт только один повтор. Но в данных есть ещё два неявных дубликата: 'APPLE 1000 ML' и 'Apple 1000 Ml'. Нужно привести значения к нижнему регистру с помощью str.lower(). Тогда метод duplicated() найдёт все дубликаты. А метод sum() можно использовать, чтобы их посчитать. Теперь повторов будет три.

Задание 2 из 5
К объекту data применили некоторый код и получили такой результат. Что это был за код? 
0    APPLE 1000 ML
1     Apple 750 ml
2    Apple 1000 Ml
3    Apple 1000 ml
4    Apple 1000 ml
dtype: object 
0    False
1    False
2    False
3    False
4     True
dtype: bool 


Правильный ответ
data.duplicated()

Метод duplicated() вернёт список из True и False. True — если значение уже встречалось. Метод value_counts() тоже возвращает список значений, но в виде пар «значение-частота». А метод sum() в сочетании с другими методами вернёт одно число.

Задание 3 из 5
Как получить такую таблицу из объекта data?
0    APPLE 1000 ML
1     Apple 750 ml
2    Apple 1000 Ml
3    Apple 1000 ml
4    Apple 1000 ml
dtype: object 
Apple 1000 ml    2
Apple 750 ml     1
APPLE 1000 ML    1
Apple 1000 Ml    1
dtype: int64 

Правильный ответ
data.value_counts()

Такой результат вернёт метод value_counts(). Значения отсортированы по убыванию: самые частотные значения указаны в начале списка.

Задание 4 из 5
Какой код выведет количество явных повторов в объекте data?
0    APPLE 1000 ML
1     Apple 750 ml
2    Apple 1000 Ml
3    Apple 1000 ml
4    Apple 1000 ml
dtype: object 

Правильный ответ
data.duplicated().sum()

Метод sum() в сочетании с duplicated() вернёт количество дубликатов. Такой код выведет 1 — столько раз повторяется значение 'Apple 1000 ml'.

Задание 5 из 5
Как перезаписать объект data, удалив все повторы и неявные дубликаты?
0    APPLE 1000 ML
1     Apple 750 ml
2    Apple 1000 Ml
3    Apple 1000 ml
4    Apple 1000 ml
dtype: object 
0    apple 1000 ml
1     apple 750 ml
dtype: object 

data = data.str.lower().drop_duplicates()

Если применить методы str.lower() и drop_duplicates() к объекту data, код выведет две строки с уникальными значениями. Но сам объект data не изменился — в этом можно убедиться, снова вызвав его. Объект нужно перезаписать, для этого результат присваивают оператором =.

Следующая тема: ПД. Категоризация данных

Вернуться к разделу: "Предобработка данных"

Вернуться в оглавление: Я.Практикум