Очистка 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 с пользователями. По спецификации нужно выполнить ровно три шага подготовки и вернуть результат.

Спецификация:

  1. Удалить строки, где 'email' или 'phone' равны NaN (dropna с subset=['email', 'phone']).
  2. Нормализовать столбец 'phone': убрать все дефисы буквальной заменой через .str.replace('-', '', regex=False).
  3. Удалить дубли по составному ключу ['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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи