Очистка pandas: dropna, str.replace и удаление дублей
При очистке таблицы сначала определите обязательные поля и ключ, по которому сравниваются дубли. dropna(subset=[...]) удаляет строки с пропусками в выбранных столбцах. Пропуск в другом столбце сам по себе такую строку не удаляет.
Сначала нормализация, затем удаление дублей
Значения "AB-12" и "AB12" станут одинаковыми после удаления дефиса. Если удалить дубли до нормализации, оба значения сохранятся. Для буквальной замены у .str.replace явно укажите regex=False, затем используйте drop_duplicates по требуемому ключу. После удаления строк .copy() позволяет безопасно работать с отдельной таблицей.
Пример на других данных
import pandas as pd
df = pd.DataFrame({"code": ["AB-12", "AB12", None, "CD-34"], "qty": [2, 2, 9, 5]})
clean = df.dropna(subset=["code"]).copy()
clean["code"] = clean["code"].str.replace("-", "", regex=False)
clean = clean.drop_duplicates(subset=["code"], keep="first")
print(clean["code"].tolist())
print(clean["qty"].tolist())
Результат:
['AB12', 'CD34']
[2, 5]
Решите задачу
Ниже — условие и редактор Python с проверкой без регистрации. Пример выше показывает приём на других данных; для задачи соблюдайте её формат ввода и результата. Курс NumPy и pandas помогает пройти темы по порядку.
Пайплайн подготовки таблицы пользователей: dropna, str.replace и дедупликация по составному ключу
Вы получаете «сырой» DataFrame с пользователями. По спецификации нужно выполнить ровно три шага подготовки и вернуть результат.
Спецификация:
- Удалить строки, где
'email'или'phone'равныNaN(dropnaсsubset=['email', 'phone']). - Нормализовать столбец
'phone': убрать все дефисы буквальной заменой через.str.replace('-', '', regex=False). - Удалить дубли по составному ключу
['email', 'phone'], оставив первое вхождение (keep='first').
Что уже дано
Проверяющая система вызывает функцию clean_users(df), передавая ей готовый pd.DataFrame. Функция должна быть определена в вашем коде. Никаких файлов и глобальных переменных система не создаёт.
Что нужно сделать
Реализуйте функцию clean_users(df: pd.DataFrame) -> pd.DataFrame, которая:
- принимает один аргумент
df— исходный DataFrame со столбцами'user_id'(int),'email'(str или NaN),'phone'(str или NaN); - выполняет три шага по спецификации в указанном порядке;
- возвращает подготовленный DataFrame с тем же набором столбцов.
Исходный DataFrame изменять необязательно — можно работать с копией.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно.
Проверяющая система вызывает clean_users(df) и проверяет возвращаемое значение:
- тип —
pd.DataFrame; - аргумент передаётся позиционно:
clean_users(df); - проверяются
shape, отсутствие NaN в'email'и'phone', уникальность составного ключа['email', 'phone']и конкретные значения'phone'после замены дефисов.
Пример использования
import pandas as pd
import numpy as np
df = pd.DataFrame({
'user_id': [991, 922, 922, 733, 844],
'email': ['a@x.ru', 'b@x.ru', 'b@x.ru', None, 'c@x.ru'],
'phone': ['9-11', '9-22', '9-22', '9-33', None],
})
result = clean_users(df)
print(result.shape)
print(result['user_id'].tolist())
print(result.duplicated(subset=['email', 'phone']).sum())
Результат:
(2, 3)
[991, 922]
0
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Pandas fillna: почему исходная таблица не изменилась
- Итоговый практикум — часть 1: подготовка одной таблицы — задача по NumPy и pandas
- Очистка заказов в pandas: даты, пропуски и дубли
- pandas: исправьте очистку таблицы транзакций
- Качество данных в pandas: пропуски, дубли и типы без изменений
- pandas: количество пропусков по столбцам — задача
