Новое Распределяем каналы MAX по категориям и территориям. Читать новость

🧹 Чистка и преобразование данных в Pandas



Разберём основные приёмы.

📄 Копия или оригинал?

В Pandas большинство методов по умолчанию не изменяют исходный DataFrame, а возвращают новый изменённый объект.

Если нужно изменить исходный, используется параметр inplace=True.

☝️ inplace=True не используется в цепочках методов (method chaining), потому что он возвращает None, а не DataFrame, и цепочка обрывается. Поэтому в стиле df.method1().method2() всегда работают методы без inplace, а результат присваивается переменной или передаётся дальше.

import pandas as pd

# ✅ Цепочки (без inplace)
df_clean = (df
.fillna(0)
.dropna()
.rename(columns={'A': 'B'}))

# ❌ Так не работает – inplace вернёт None
df.fillna(0, inplace=True).dropna() # Ошибка!


🍩 Что делать с пропусками?

.dropna() и .fillna() — два основных метода для работы с пропущенными значениями (NaN, None, NaT).

Для замены других некорректных значений (например, 0 или пустая строка) используйте .replace() (см.ниже).

Выбор зависит от количества пропусков:
• Удалить (.dropna()) — когда данные с пропусками не нужны для анализа (теряем объём, но избавляемся от проблем)
• Заполнить (.fillna()) — когда пропусков мало и разумная замена (среднее, медиана, 0 и т.п.) не сильно исказит данные

df.dropna() # удалить строки с любым NaN
df.dropna(how='all') # удалить строки, где все значения NaN

df.fillna(0)
# заполнить константой
df.fillna(df['cost'].mean()) # заполнить средним по столбцу
df.fillna(df.median()) # каждый столбец заполняет свои пропуски собственной медианой этого же столбца


🔄 Преобразование типов данных

Изменить тип столбца можно с помощью .astype():

df['price'] = df['price'].astype('float32')
df['date'] = pd.to_datetime(df['date']) # работа с датами


🆕 Перезапись существующих столбцов

➡️ Простое добавление новых столбцов — описано ранее.

Перезапись происходит через прямое переприсваивание:

# Повышаем цены на 10%
df['price'] = df['price'] * 1.1 # без методов .update() или .replace()


📌 Замена значений: .apply(), .map(), .replace()

Метод .apply() — для функции любой сложности (своей, lambda, встроенной) на Series и DataFrame

Лямбда — компактная функция в одну строку (одно выражение). Для простых действий это удобнее, чем создавать отдельную функцию:
lambda x: x * 1.1 # возьми x, верни x * 1.1

# лямбда-функция: пересчёт цены в доллары
df['price_usd'] = df['price_eur'].apply(lambda x: x * 1.1)

# своя функция (когда логика сложнее)
def discount(price):
return price * 0.9 if price > 1000 else price

df['price_disc'] = df['price'].apply(discount)

# применение к строке (axis=1) — для больших данных может быть медленнее векторизованных операций
df['full_info'] = df.apply(lambda row: f"{row['name']} - {row['price']}", axis=1)

Метод .map() — простое преобразование элементов или замена значений по словарю (только Series)

# Замена кодов на названия городов
df['city'] = df['city_code'].map({1: 'Москва', 2: 'СПб', 3: 'Казань'})
# Если кода нет в словаре → NaN


Метод .replace() — глобальная замена конкретных значений (Series и DataFrame)

# Замена 'Msk' на 'Москва', 'Spb' на 'СПб' (во всём DataFrame)
df['city'] = df['city'].replace({'Msk': 'Москва', 'Spb': 'СПб'})


Короткое правило:
• одна колонка → .map()
• весь DataFrame → .replace()

➗ Разделение строк

# Исходные данные
df = pd.DataFrame({'full_name': ['Иванов Иван', 'Петров Петр', 'Сидоров Сидор']})

# Разделяем фамилию и имя
df[['last_name', 'first_name']] = df['full_name'].str.split(' ', expand=True)


✅ Что нужно запомнить

• Копии vs оригинала (inplace и method chaining)
• Работа с пропусками: .dropna(), .fillna()
• Преобразование типов: .astype(), pd.to_datetime()
• Перезапись существующих столбцов:
.apply() с кастомными функциями любой сложности
.map() — замена по словарю
.replace() — глобальная замена значений
• Разделение строк .str.split()

💬 Далее:
Pandas. Группировки и агрегации
Просмотры: 275
Открыть в MAX Сообщить о неточности

Сообщить о неточности

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

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти