7 эффективных методов фильтрации данных в pandas: быстрый анализ

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Аналитики данных или студенты, изучающие аналитику
  • Специалисты, начинающие работать с библиотекой pandas
  • Люди, заинтересованные в бизнес-аналитике и оптимизации обработки данных

    При работе с данными мы постоянно сталкиваемся с необходимостью найти "иголку в стоге сена" – выделить ключевые строки и столбцы из огромных таблиц. Правильно организованная фильтрация данных в pandas – это не просто техническая необходимость, а настоящее искусство, экономящее часы работы и повышающее точность анализа. Освоив 7 эффективных методов фильтрации, которые я разбираю ниже, вы сможете в разы ускорить обработку данных и сделать свой код более элегантным, понятным и производительным. 🚀

Хотите превратиться из новичка в профессионала анализа данных? На курсе Профессия аналитик данных от Skypro вы научитесь не только фильтровать данные в pandas, но и мастерски визуализировать результаты, строить предиктивные модели и принимать бизнес-решения на основе данных. Программа разработана для практического применения навыков с первого месяца обучения – наши выпускники востребованы в ведущих компаниях уже после 9 месяцев обучения.

Основы фильтрации данных в pandas: теория и подготовка

Фильтрация данных – фундаментальная операция в арсенале каждого аналитика данных. В библиотеке pandas эта задача решается элегантно и эффективно благодаря встроенным методам и синтаксису. Правильный подход к фильтрации не только ускоряет анализ, но и делает код более читабельным и поддерживаемым.

Начнем с подготовки рабочего окружения. Для работы с примерами вам понадобятся следующие библиотеки:

Python
Скопировать код
import pandas as pd
import numpy as np
import time # для измерения производительности

Давайте создадим тестовый DataFrame, который будем использовать для демонстрации различных методов фильтрации:

Python
Скопировать код
# Создаем тестовый DataFrame
data = {
'имя': ['Анна', 'Иван', 'Мария', 'Алексей', 'Екатерина'],
'возраст': [25, 32, 28, 41, 35],
'город': ['Москва', 'Санкт-Петербург', 'Москва', 'Казань', 'Новосибирск'],
'зарплата': [75000, 120000, 82000, 97000, 105000],
'опыт_работы': [2, 7, 4, 12, 9]
}

df = pd.DataFrame(data)
print(df)

Перед тем как приступить к фильтрации, полезно понимать структуру нашего DataFrame. Методы info() и describe() дают нам представление о данных:

Python
Скопировать код
df.info()
df.describe()

Ключевые аспекты, которые следует учитывать при фильтрации данных в pandas:

  • Тип данных — различные типы (числа, строки, даты) требуют разных подходов к фильтрации
  • Размер данных — для больших датасетов важно выбирать оптимизированные методы фильтрации
  • Сложность условий — простые условия можно реализовать базовыми методами, для сложных понадобятся продвинутые техники
  • Читаемость кода — хорошо структурированный код фильтрации облегчает его поддержку и расширение

Отдельно стоит отметить, что фильтрация в pandas обычно создает представление (view) исходного DataFrame, а не его копию, что экономит память при работе с большими данными. Однако в некоторых случаях может потребоваться явное создание копии с помощью метода .copy().

Пошаговый план для смены профессии

Метод базовой индексации: фильтрация с помощью операторов сравнения

Антон Корнеев, старший аналитик данных

Когда я только начинал работать с pandas, мне казалось, что базовая фильтрация — это "детский сад" для новичков. На одном из проектов мне нужно было быстро отфильтровать транзакции клиентов по нескольким простым условиям. Вместо использования привычных методов я решил написать "элегантное" решение с вложенными функциями. Результат? Код выполнялся в 3 раза дольше, чем мог бы, и коллеги едва разобрались в моих конструкциях. Тогда я понял ценность базовой индексации — она не только быстрее в большинстве случаев, но и делает код понятным для всей команды. С тех пор я начинаю с простейших методов и усложняю только когда это действительно необходимо.

Базовая индексация — самый интуитивно понятный способ фильтрации в pandas. Этот метод использует операторы сравнения для создания логической маски, которая затем применяется к DataFrame.

Рассмотрим несколько примеров базовой фильтрации:

Python
Скопировать код
# Фильтрация по одному условию: сотрудники старше 30 лет
сотрудники_старше_30 = df[df['возраст'] > 30]
print(сотрудники_старше_30)

# Фильтрация по точному значению: сотрудники из Москвы
москвичи = df[df['город'] == 'Москва']
print(москвичи)

# Фильтрация по диапазону: сотрудники с зарплатой от 80000 до 100000
средняя_зарплата = df[(df['зарплата'] >= 80000) & (df['зарплата'] <= 100000)]
print(средняя_зарплата)

Обратите внимание на синтаксис при использовании нескольких условий. В pandas логические операторы and и or заменяются на & и | соответственно, а условия необходимо заключать в скобки.

Преимущества и недостатки базовой индексации:

Преимущества Недостатки
Интуитивно понятный синтаксис Может быть громоздким при сложных условиях
Высокая производительность для простых условий Требует скобок вокруг каждого условия
Не требует изучения дополнительных методов Не оптимален для некоторых типов строковых операций
Работает с любыми типами данных Может быть менее читабельным при многих условиях

Базовая индексация также позволяет использовать функции pandas для более сложной фильтрации:

Python
Скопировать код
# Использование метода .isin() для фильтрации по списку значений
города = ['Москва', 'Санкт-Петербург']
крупные_города = df[df['город'].isin(города)]
print(крупные_города)

# Использование метода .str для работы со строками
начинается_с_А = df[df['имя'].str.startswith('А')]
print(начинается_с_А)

Важно помнить о порядке выполнения операций при создании сложных фильтров. Несоблюдение этого порядка может привести к неожиданным результатам. Рекомендую всегда использовать скобки для группировки условий, даже если они кажутся избыточными. 🧠

Продвинутая фильтрация с loc[] и iloc

Методы loc[] и iloc[] представляют собой мощные инструменты для точной фильтрации данных в pandas. Они позволяют не только выбирать строки по условиям, но и одновременно фильтровать столбцы, что значительно повышает гибкость и производительность операций.

loc[] работает с метками индексов и имен столбцов, в то время как iloc[] использует целочисленные позиции. Эта разница принципиальна при выборе подходящего метода для конкретной задачи.

Python
Скопировать код
# Фильтрация с помощью loc[]
# Выбираем строки, где возраст > 30, и только столбцы 'имя' и 'зарплата'
результат_loc = df.loc[df['возраст'] > 30, ['имя', 'зарплата']]
print(результат_loc)

# Фильтрация с помощью iloc[]
# Выбираем первые 3 строки и столбцы с индексами 0, 3 (имя и зарплата)
результат_iloc = df.iloc[0:3, [0, 3]]
print(результат_iloc)

Комбинированное использование loc[] с булевыми масками и диапазонами значений открывает еще больше возможностей:

Python
Скопировать код
# Комбинированное использование loc[]
# Фильтруем сотрудников из Москвы с опытом работы > 3 лет
# и выбираем столбцы от 'имя' до 'зарплата'
опытные_москвичи = df.loc[(df['город'] == 'Москва') & (df['опыт_работы'] > 3), 'имя':'зарплата']
print(опытные_москвичи)

Одним из преимуществ loc[] и iloc[] является возможность изменения данных непосредственно во время фильтрации:

Python
Скопировать код
# Используем loc[] для изменения данных
# Увеличиваем зарплату на 10% для сотрудников старше 30 лет
df_copy = df.copy() # Создаем копию для демонстрации
df_copy.loc[df_copy['возраст'] > 30, 'зарплата'] *= 1.1
print(df_copy)

Ключевые различия между методами фильтрации приведены в таблице:

Критерий Базовая индексация loc[] iloc[]
Индексация По условиям По меткам По позиции
Выбор столбцов Требует отдельной операции В том же выражении В том же выражении
Скорость Высокая для простых условий Высокая для сложных условий Наивысшая
Модификация данных Требует дополнительных шагов Прямая модификация Прямая модификация

Рекомендации по использованию loc[] и iloc[]:

  • Используйте loc[], когда работаете с метками индексов и именами столбцов
  • Применяйте iloc[] для позиционного доступа и при работе с числовыми индексами
  • Для одновременной фильтрации строк и столбцов предпочтительнее loc[] и iloc[], а не цепочка операций с базовой индексацией
  • При модификации данных всегда используйте loc[] или iloc[] для избежания предупреждений о копировании

Осваивая эти методы, вы существенно повысите эффективность работы с DataFrame и сделаете код более элегантным и производительным. 🔍

Метод query() для сложных условий фильтрации данных

Метод query() появился в pandas как элегантное решение для выражения сложных условий фильтрации в более читаемой и компактной форме. Этот метод принимает строку с выражением для фильтрации, что делает код более похожим на естественный язык SQL.

Базовый синтаксис query() выглядит следующим образом:

Python
Скопировать код
# Фильтрация сотрудников старше 30 лет с зарплатой выше 100000
результат = df.query('возраст > 30 and зарплата > 100000')
print(результат)

# Эквивалент с использованием базовой индексации
результат_базовый = df[(df['возраст'] > 30) & (df['зарплата'] > 100000)]
print(результат_базовый)

Преимущество query() особенно заметно при составлении сложных условий фильтрации, которые в базовой индексации требуют множества скобок и выглядят громоздко:

Python
Скопировать код
# Сложное условие с query()
результат = df.query('(город == "Москва" or город == "Санкт-Петербург") and (возраст < 35 and зарплата > 80000)')
print(результат)

# Тот же запрос с базовой индексацией
условие1 = (df['город'] == 'Москва') | (df['город'] == 'Санкт-Петербург')
условие2 = (df['возраст'] < 35) & (df['зарплата'] > 80000)
результат_базовый = df[условие1 & условие2]
print(результат_базовый)

Метод query() поддерживает различные операции и функции:

  • Доступ к переменным из внешнего контекста с префиксом @
  • Операции со строками, включая проверку подстрок
  • Методы строк с использованием синтаксиса .str
  • Проверки на вхождение в список с помощью in

Примеры этих возможностей:

Python
Скопировать код
# Использование внешних переменных
мин_возраст = 30
мин_зарплата = 90000
результат = df.query('возраст > @мин_возраст and зарплата > @мин_зарплата')
print(результат)

# Работа со строками
результат = df.query('город.str.contains("Москва")')
print(результат)

# Проверка на вхождение в список
города = ['Москва', 'Санкт-Петербург']
результат = df.query('город in @города')
print(результат)

При работе с колонками, имена которых содержат пробелы или специальные символы, их необходимо заключить в обратные кавычки:

Python
Скопировать код
df2 = df.copy()
df2.rename(columns={'опыт_работы': 'опыт работы'}, inplace=True)
результат = df2.query('`опыт работы` > 5')
print(результат)

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

Сценарии, в которых query() особенно полезен:

  • Запросы с множественными условиями, связанными логическими операторами
  • Фильтрация, основанная на внешних переменных или параметрах
  • Когда важна читаемость кода и его поддерживаемость
  • При необходимости динамически формировать условия фильтрации

В командных проектах использование query() может значительно повысить понятность кода даже для тех членов команды, которые не являются экспертами в pandas, но знакомы с принципами SQL. 💡

Высокопроизводительная фильтрация больших датасетов в pandas

Наталья Соколова, ведущий дата-сайентист

В одном из проектов нам пришлось обрабатывать логи мобильного приложения — более 50 миллионов строк с десятками параметров. Мы использовали стандартную фильтрацию pandas, и время выполнения запросов измерялось в минутах. Ситуация стала критической, когда руководство запросило ежедневные отчеты. После анализа мы разделили данные на блоки по датам, применили параллельную обработку через Dask и добавили предварительную категоризацию строковых колонок. Время обработки сократилось до 45 секунд! Позже я провела тренинг для команды, где мы разобрали различные техники фильтрации. Оказалось, что многие не знали о категориальных типах данных и их влиянии на производительность. Теперь эти техники — часть нашего стандартного стека.

При работе с большими датасетами (миллионы или десятки миллионов строк) стандартные методы фильтрации могут работать недостаточно эффективно. В таких ситуациях необходимо применять специализированные техники для повышения производительности.

Рассмотрим основные стратегии оптимизации фильтрации больших объемов данных:

1. Оптимизация типов данных

Одним из наиболее эффективных способов ускорения фильтрации является правильный выбор типов данных:

Python
Скопировать код
# Пример оптимизации строковых колонок через категориальные типы
df_large = pd.DataFrame({
'город': np.random.choice(['Москва', 'Санкт-Петербург', 'Новосибирск', 'Казань'], 1000000),
'возраст': np.random.randint(18, 70, 1000000),
'доход': np.random.randint(30000, 200000, 1000000)
})

# Измеряем время фильтрации до оптимизации
start = time.time()
результат1 = df_large[df_large['город'] == 'Москва']
время_до = time.time() – start

# Оптимизируем тип данных
df_large['город'] = df_large['город'].astype('category')

# Измеряем время после оптимизации
start = time.time()
результат2 = df_large[df_large['город'] == 'Москва']
время_после = time.time() – start

print(f"Время до оптимизации: {время_до:.4f} сек")
print(f"Время после оптимизации: {время_после:.4f} сек")
print(f"Ускорение: {время_до/время_после:.2f}x")

Для числовых колонок можно использовать более компактные типы данных:

Python
Скопировать код
# Оптимизация числовых колонок
df_large['возраст'] = df_large['возраст'].astype(np.int8) # возраст не требует большой разрядности
df_large['доход'] = df_large['доход'].astype(np.int32) # уменьшаем разрядность для дохода

2. Индексация данных

Правильное использование индексов может значительно ускорить фильтрацию:

Python
Скопировать код
# Создаем индекс по часто используемой колонке фильтрации
df_large = df_large.set_index('город')

# Фильтрация по индексированной колонке
start = time.time()
результат = df_large.loc['Москва']
время_с_индексом = time.time() – start
print(f"Время с использованием индекса: {время_с_индексом:.4f} сек")

3. Использование специализированных библиотек

Для экстремально больших датасетов pandas может быть недостаточно. В таких случаях эффективно применять специализированные библиотеки:

  • Dask — для параллельной обработки данных, не помещающихся в оперативную память
  • Vaex — для работы с данными объемом до ~1TB на обычном компьютере
  • PyTables — для эффективного хранения и запросов к большим табличным данным
  • NumPy — для высокопроизводительных операций, когда не требуется весь функционал pandas

Пример использования Dask:

Python
Скопировать код
import dask.dataframe as dd

# Преобразуем pandas DataFrame в Dask DataFrame
dask_df = dd.from_pandas(df_large.reset_index(), npartitions=4)

# Выполняем фильтрацию
результат = dask_df[dask_df['город'] == 'Москва'].compute()

4. Предварительная агрегация и подготовка данных

Часто эффективнее сначала агрегировать данные, а затем проводить фильтрацию:

Python
Скопировать код
# Агрегация перед фильтрацией
агрегированные_данные = df_large.reset_index().groupby('город').agg({
'возраст': 'mean',
'доход': ['mean', 'min', 'max', 'count']
})

# Теперь можно быстро фильтровать по агрегированным данным
результат = агрегированные_данные.loc['Москва']

Сравнение эффективности различных методов фильтрации на больших данных:

  • Используйте .query() для сложных условий, особенно когда условия вычисляются динамически
  • Для простых условий базовая индексация часто работает быстрее query()
  • При необходимости фильтрации по столбцам и строкам одновременно loc[] обычно эффективнее
  • Для частых фильтраций по одному столбцу оптимально сделать его индексом

Помните, что оптимальная стратегия фильтрации зависит от конкретной задачи, структуры данных и доступных вычислительных ресурсов. Рекомендую проводить бенчмарки на реальных данных для выбора наиболее эффективного подхода. 🚀

Boolean индексация и составные логические условия в pandas

Boolean (логическая) индексация — это мощный метод фильтрации данных, основанный на создании масок с логическими значениями True/False. Каждое значение True указывает, что соответствующая строка должна быть включена в результат, а False — исключена.

Основные операции булевой индексации:

Python
Скопировать код
# Создание простой логической маски
маска = df['возраст'] > 30
print(маска)

# Применение маски для фильтрации
результат = df[маска]
print(результат)

# Создание и применение маски в одной операции
результат = df[df['возраст'] > 30]
print(результат)

Сила булевой индексации раскрывается при создании сложных составных условий с логическими операторами. Важно помнить, что в pandas используются побитовые операторы для комбинирования условий:

  • & — логическое И (AND)
  • | — логическое ИЛИ (OR)
  • ~ — логическое НЕ (NOT)

Примеры составных логических условий:

Python
Скопировать код
# AND: сотрудники старше 30 лет из Москвы
результат = df[(df['возраст'] > 30) & (df['город'] == 'Москва')]
print(результат)

# OR: сотрудники из Москвы или с зарплатой выше 100000
результат = df[(df['город'] == 'Москва') | (df['зарплата'] > 100000)]
print(результат)

# NOT: все сотрудники кроме тех, кто из Москвы
результат = df[~(df['город'] == 'Москва')]
print(результат)

# Комбинация операторов: сотрудники старше 30 лет из Москвы или с опытом больше 5 лет
результат = df[((df['возраст'] > 30) & (df['город'] == 'Москва')) | (df['опыт_работы'] > 5)]
print(результат)

Важно отметить необходимость заключения каждого условия в скобки при использовании операторов & и |. Это связано с приоритетом операций в Python.

Дополнительные возможности булевой индексации:

1. Методы строк в условиях

Python
Скопировать код
# Фильтрация по подстроке
результат = df[df['имя'].str.contains('Ан')]
print(результат)

# Фильтрация по регулярному выражению
результат = df[df['имя'].str.match(r'[АИ]\w+')] # имена, начинающиеся с А или И
print(результат)

2. Проверка на вхождение в множество

Python
Скопировать код
# Использование .isin() для проверки вхождения в список
города = ['Москва', 'Санкт-Петербург']
результат = df[df['город'].isin(города)]
print(результат)

# Отрицание условия вхождения
результат = df[~df['город'].isin(города)]
print(результат)

3. Работа с пропущенными значениями

Python
Скопировать код
# Добавим несколько пропущенных значений
df_missing = df.copy()
df_missing.loc[1, 'зарплата'] = None
df_missing.loc[3, 'город'] = None

# Фильтрация строк с пропущенными значениями
результат = df_missing[df_missing['зарплата'].isna()]
print(результат)

# Фильтрация строк без пропущенных значений во всем DataFrame
результат = df_missing.dropna()
print(результат)

# Фильтрация строк без пропущенных значений в конкретных столбцах
результат = df_missing.dropna(subset=['город', 'зарплата'])
print(результат)

4. Условия на основе нескольких столбцов

Python
Скопировать код
# Фильтрация, где зарплата больше возраста * 3000
результат = df[df['зарплата'] > (df['возраст'] * 3000)]
print(результат)

# Фильтрация по разнице значений в столбцах
результат = df[(df['зарплата'] / df['опыт_работы']) > 20000] # зарплата на год опыта > 20000
print(результат)

Для повышения производительности при работе со сложными булевыми выражениями:

  • Размещайте более селективные условия первыми (при использовании оператора &)
  • Сохраняйте промежуточные маски в переменных при их повторном использовании
  • Используйте numexpr для ускорения вычисления сложных выражений

Булевая индексация в сочетании с другими методами фильтрации предоставляет практически неограниченные возможности для выбора нужных данных. Мастерство в создании эффективных логических масок — один из ключевых навыков продвинутого аналитика данных. 🧮

Практические кейсы фильтрации данных в бизнес-аналитике

Теоретические знания о методах фильтрации обретают особую ценность, когда мы применяем их к реальным бизнес-задачам. Рассмотрим несколько практических кейсов, демонстрирующих эффективное применение различных методов фильтрации в бизнес-аналитике.

Для примеров создадим более реалистичный набор данных:

Python
Скопировать код
# Создаем датасет для бизнес-аналитики
np.random.seed(42)
n = 1000

data_business = {
'дата': pd.date_range(start='2022-01-01', periods=n),
'клиент_id': np.random.randint(1000, 9999, n),
'категория': np.random.choice(['Электроника', 'Одежда', 'Продукты', 'Мебель', 'Услуги'], n),
'сумма': np.random.randint(500, 15000, n),
'скидка': np.random.randint(0, 30, n),
'регион': np.random.choice(['Центр', 'Север', 'Юг', 'Восток', 'Запад'], n),
'канал_продаж': np.random.choice(['Онлайн', 'Магазин', 'Телефон'], n),
'статус_оплаты': np.random.choice(['Оплачено', 'Ожидание', 'Отменено'], n, p=[0\.8, 0.15, 0.05])
}

sales_df = pd.DataFrame(data_business)
print(sales_df.head())

Кейс 1: Анализ эффективности каналов продаж

Задача: определить, какой канал продаж генерирует наибольшую выручку для категории "Электроника" в разных регионах.

Python
Скопировать код
# Базовая фильтрация для категории "Электроника"
электроника = sales_df[sales_df['категория'] == 'Электроника']

# Группировка и анализ по регионам и каналам продаж
результат = электроника.groupby(['регион', 'канал_продаж'])['сумма'].agg(['sum', 'count', 'mean'])
print(результат.sort_values(by='sum', ascending=False))

# Определение наиболее эффективного канала в каждом регионе
лучшие_каналы = результат.reset_index().sort_values(['регион', 'sum'], ascending=[True, False])
лучший_канал_по_региону = лучшие_каналы.groupby('регион').first()
print("Лучший канал продаж по региону:")
print(лучший_канал_по_региону[['канал_продаж', 'sum']])

Кейс 2: Выявление аномальных транзакций

Задача: найти подозрительные транзакции, которые значительно отклоняются от среднего чека в своей категории.

Python
Скопировать код
# Рассчитываем средний чек и стандартное отклонение по категориям
статистика = sales_df.groupby('категория')['сумма'].agg(['mean', 'std'])

# Объединяем со статистикой для сравнения
sales_with_stats = sales_df.merge(статистика, on='категория')

# Используем .loc[] для выявления аномалий (чек отклоняется более чем на 2 стандартных отклонения)
аномальные_транзакции = sales_with_stats.loc[
(sales_with_stats['сумма'] > (sales_with_stats['mean'] + 2 * sales_with_stats['std'])) | 
(sales_with_stats['сумма'] < (sales_with_stats['mean'] – 2 * sales_with_stats['std']))
]

print(f"Выявлено {len(аномальные_транзакции)} аномальных транзакций")
print(аномальные_транзакции[['дата', 'категория', 'сумма', 'mean', 'std']].head())

Кейс 3: Сегментация клиентов по активности и чеку

Задача: разделить клиентов на сегменты по частоте покупок и среднему чеку для таргетированного маркетинга.

Python
Скопировать код
# Агрегируем данные по клиентам
клиенты = sales_df.groupby('клиент_id').agg({
'дата': 'count', # количество покупок
'сумма': 'mean' # средний чек
}).rename(columns={'дата': 'количество_покупок'})

# Используем query() для сегментации клиентов
vip = клиенты.query('количество_покупок >= 5 and сумма >= 8000')
стандарт = клиенты.query('(количество_покупок >= 3 and сумма >= 5000) and (количество_покупок < 5 or сумма < 8000)')
эконом = клиенты.query('количество_покупок < 3 or сумма < 5000')

print(f"VIP клиенты: {len(vip)}")
print(f"Стандартные клиенты: {len(стандарт)}")
print(f"Эконом клиенты: {len(эконом)}")

# Проверяем общее количество для контроля
print(f"Всего уникальных клиентов: {len(клиенты)}")
print(f"Сумма сегментов: {len(vip) + len(стандарт) + len(эконом)}")

Кейс 4: Анализ сезонности продаж

Задача: определить, как меняется структура продаж по категориям в разные месяцы года.

Python
Скопировать код
# Добавляем месяц для анализа сезонности
sales_df['месяц'] = sales_df['дата'].dt.month

# Используем boolean индексацию и группировку для анализа
продажи_по_месяцам = sales_df.groupby(['месяц', 'категория'])['сумма'].sum().unstack()

# Анализируем категорию с наибольшими продажами в каждом месяце
лучшая_категория = продажи_по_месяцам.idxmax(axis=1)
print("Лучшая категория по месяцам:")
print(лучшая_категория)

# Находим месяцы с максимальными продажами для каждой категории
лучшие_месяцы = продажи_по_месяцам.idxmax()
print("\nЛучший месяц для каждой категории:")
print(лучшие_месяцы)

Кейс 5: Оптимизация скидочной политики

Задача: определить оптимальный размер скидки, который максимизирует выручку по разным категориям товаров.

Python
Скопировать код
# Группируем по категории и размеру скидки для анализа
скидки_эффективность = sales_df.groupby(['категория', 'скидка']).agg({
'сумма': ['sum', 'count', 'mean'],
'клиент_id': 'nunique' # количество уникальных клиентов
})

# Находим скидки с максимальной выручкой для каждой категории
оптимальные_скидки = скидки_эффективность['сумма']['sum'].unstack().idxmax(axis=1)
print("Оптимальный размер скидки по категориям:")
print(оптимальные_скидки)

# Анализируем влияние скидок на частоту покупок для категории "Одежда"
одежда_скидки = sales_df[sales_df['категория'] == 'Одежда']
частота_по_скидкам = одежда_скидки.groupby('скидка')['клиент_id'].count()
print("\nВлияние скидок на частоту покупок (Одежда):")
print(частота_по_скидкам)

Эти кейсы демонстрируют, как различные методы фильтрации данных в pandas могут применяться для решения реальных бизнес-задач. Ключевые рекомендации по выбору метода фильтрации:

  • Для простых условий и быстрого анализа — используйте базовую индексацию
  • Для работы с датами и временными рядами — методы из datetime модуля pandas
  • Для сложных, многосоставных условий — query() или логические маски
  • Для больших объемов данных — оптимизируйте типы данных и используйте специализированные методы
  • Для четких срезов данных по индексам и столбцам — loc[] и iloc[]

Мастерство в выборе и применении различных методов фильтрации данных — неотъемлемая часть арсенала успешного аналитика данных, позволяющая эффективно извлекать бизнес-инсайты из массивов информации. 📊

Фильтрация данных в pandas — это значительно больше, чем просто техническая процедура. Это искусство обнаружения ценных инсайтов, скрытых в данных. Мастерски применяя различные методы — от базовой индексации до сложных условий query() и высокопроизводительных решений для больших датасетов — вы трансформируете свой аналитический процесс. Помните: выбор оптимального метода фильтрации напрямую влияет не только на производительность вашего кода, но и на качество принимаемых бизнес-решений. Применяйте эти техники целенаправленно, комбинируйте их и адаптируйте под конкретные задачи — и ваша работа с данными станет по-настоящему эффективной.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой оператор используется для фильтрации строк, где значение в столбце 'Оценка' больше 85?
1 / 5

Загрузка...