Статья Автор: Лебедев Дмитрий Алексеевич

Модеуль "Предобработка данных"

Этот датасет содержит информацию о 300 уникальных персонажах вымышленной вселенной, похожей на Marvel. Данные были сгенерированы со специальной логикой, чтобы сделать анализ интересным.
Название столбца тип, диапазон описание комментарий
full_name string Полное имя: Настоящее гражданское имя персонажа Все имена уникальны.
alias string Псевдоним: Супергеройское или злодейское прозвище  
age int (18 - 1000) Возраст: Возраст персонажа в годах Может быть больше 100 для инопланетян и долгожителей
power int (1 - 100) Сила: Уровень физической силы, боевой мощи и способностей. Измеряется по шкале от 1 до 100.
Где 100: Невероятная, богоподобная сила 
Где 50: Средние способности 
Где 1: Почти отсутствуют (обычный человек).
intelligence int (1-100) Интеллект: Уровень умственных способностей, стратегического мышления и изобретательности. Шкала от 1 до 100.
Где 100: Гениальный уровень (
Где 50: Средний интеллект.
Где 1: Очень низкий.
universe string Вселенная/Планета происхождения):Родной мир персонажа Примеры значений: 'Earth' (Земля), 'Asgard' (Асгард), 'Wakanda' (Ваканда), 'Latveria' (Латверия).
is_hero bool Является ли героем: Принадлежность к лагерю добра или зла. Значения: True — герой, False — злодей.
first_appearance int (1940 - 2023) Год первого появления:Вымышленный год, когда этот персонаж впервые появился в комиксах. Чем меньше число, тем "старше" и легендарнее персонаж.
costume_cost int Стоимость костюма: Предполагаемая стоимость костюма и экипировки персонажа в долларах США. Особенность: У технологичных героев (Железный человек) и королей (Черная пантера) стоимость может достигать миллионов и даже миллиардов долларов.
popularity int (1-100) Популярность:Условный рейтинг популярности среди фанатов по шкале от 1 до 100 Шкала от 1 до 100.
Где 100: Невероятно популярный (Человек-паук).
Где 50: Узнаваемый персонаж.
Где 1: Забытый герой или неудачливый злодей.

Поиск пропусков 

Пропущенные значения (NaN, None, NULL) - одна из главных проблем при анализе данных.

Поиск пропусков

df.isnull() - находит пропуски
df.isnull().sum() - считает пропуски по столбцам

 

Задание

Проанализируйте датасет супергероев, считав его из прикрепленного файла
Напишите программу, который ищет пропуски. Выведите

  1. В первой строке - количество пропусков в каждом столбце (семь целых чисел через пробел)
  2. Во второй строке - процент пропущенных значений (отбросив дробную часть) для каждого столбца  (семь целых чисел через пробел)
Числа должны быть в порядке перечисления столбцов в датасете.

Пример вывода (пример дан для понимания формата вывода):
1 2 3 2 1 1 4
10 20 30 20 10 10 40


Обработка пропусков

Обработка пропусков

df.dropna() - удаляет строки с пропусками
df.fillna(value, inplace=True) - заполняет пропуски значением value
df.fillna(df.mean(), inplace=True) - заполняет средним значением

Параметр inplace:
inplace=False (по умолчанию) - создает копию с изменениями
inplace=True- изменяет исходный DataFrame напрямую

Метод fillna() с словарем позволяет заполнить пропуски в разных столбцах различными значениями за одну операцию. Синтаксис:
df.fillna({'column1': value1, 'column2': value2, ...})
Пример
 
df = ...
# Заполнение разными значениями
fill_dict = {
    'age': df['age'].mean(),      # Средним значением
    'salary': df['salary'].median(), # Медианой
    'city': 'Unknown'             # Константой
}

df_filled = df.fillna(fill_dict)
print(df_filled)
 

Задание

Проанализируйте датасет супергероев, считав его из прикрепленного файла
Напишите программу, который ищет и обрабатывает пропуски. 

  1. Заполните пропуски в power и intelligence средними значениями
  2. Заполните пропуски в costume_cost медианным значением 
  3. Заполните пропуски в first_appearance значением 1950 
  4. Для текстовых полей (name, alias, universe) заполните пропуски строкой Unknown
Выведите обработанный датасет на экран, используя print(df)


Удаление дубликатов 


убликаты - одинаковые строки в данных, которые могут исказить анализ.

Основные методы

df.duplicated() - находит дубликаты (возвращает True/False)
df.drop_duplicates() - удаляет дубликаты
df.nunique() - количество уникальных значений
Параметры drop_duplicates()
subset - столбцы для проверки дубликатов
keep - какую копию оставить ('first','last', False)
ignore_index -  пересоздает аккуратный последовательный индекс (0, 1, 2, 3, 4...).
Пример
df_clean = df.drop_duplicates()  # Удалить полные дубликаты
df_partial = df.drop_duplicates(subset=['name'])  # По имени
df_last = df.drop_duplicates(keep='last')  # Оставить последний

Задание

1) Посчитайте количество полных дубликатов в прикрепленном датасете (программа должна вывести целое число)
2) Удалите все полные дубликаты и выведите размер получившегося датасета.


Обработка строк

Строковые данные часто требуют очистки и преобразования. Методы .str помогают очищать текстовые данные: lower(), upper(), title(), replace(), strip().

Основные методы

  • df['col'].str.lower() - перевод в нижний регистр
  • df['col'].str.upper() - перевод в верхний регистр
  • df['col'].str.title() - заглавные буквы слов
  • df['col'].str.strip() - удаление пробелов по краям (strip() принимает в качестве параметров строку с символами, которые будут удалены. По умолчанию, пробел)
  • df['col'].str.replace('old', 'new') - замена подстрок
  • df['col'].str.contains('pattern') - поиск подстроки
  • df['col'].str.len() - длина строки
Пример

df['name'] = df['name'].str.title()


Задание

Создайте функцию clean_hero_strings(df), которая выполняет всю очистку строковых данных автоматически. Функция должна вернуть исправленный DataFrame.
В функции необходимо реализовать следующий функционал.

1. Базовая очистка

  •   Удалите лишние пробелы во всех текстовых столбцах (name, alias, universe)
  •   Приведите имена (name) к формату "Имя Фамилия" (Title Case)
  •   Приведите псевдонимы (alias) к верхнему регистру


2. Стандартизация

   Приведите названия вселенных (`universe`) к единому формату: "Marvel" или "DC" (замените "marvel comics" и "dc comics" на "Marvel" и "DC" соответственно. Других значений в датасете в указанном столбце нет)

 


Группировка с вычисляемыми полями (Задание 5)

Создай новое поле total_stats, которое представляет сумму силы и интеллекта каждого персонажа. Затем проанализируй, чьи характеристики более сбалансированы - у героев или злодеев. Для этого сгруппируй данные по признаку is_hero и посчитай среднее значение, медиану и стандартное отклонение общего показателя характеристик.

На основе полученных результатов ответь на вопросы:

  1. У кого в среднем выше суммарный показатель характеристик - у героев или злодеев?
    (героев/злодеев)
  2. На сколько единиц средний суммарный показатель злодеев выше, чем у героев?
    (округли до целых)
  3. Чьи характеристики более стабильны/предсказуемы - у героев или злодеев?
    (суди по стандартному отклонению)
  4. Какова медианная сумма характеристик у героев?
  5. У какой группы больше разброс в характеристиках? (герои/злодеи)

Печать