5 мощных техник выбора столбцов в Pandas для анализа данных

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

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

  • Аналитики данных, работающие с Pandas
  • Студенты и начинающие специалисты в области анализа данных
  • Профессионалы, стремящиеся улучшить свои навыки выборки данных в Pandas

    Манипуляция данными в Pandas часто напоминает хирургическую операцию — точность здесь критична. Выбор нескольких столбцов из DataFrame — одна из тех фундаментальных операций, которую каждый аналитик данных выполняет десятки раз в день. Несмотря на кажущуюся простоту, неправильный подход к выборке столбцов может привести к раздутому коду, снижению производительности или даже неверным результатам анализа. В этой статье мы вооружим вас пятью мощными техниками, которые превратят вашу работу с DataFrame из рутины в искусство. 🔍

Освоение библиотеки Pandas — лишь верхушка айсберга в арсенале современного аналитика данных. На курсе Профессия аналитик данных от Skypro вы не только детально изучите все инструменты для обработки данных, но и научитесь применять их в реальных проектах под руководством действующих экспертов. Вместо долгих лет самостоятельного освоения — 9 месяцев структурированного обучения с гарантированным трудоустройством. Ваш путь к профессии аналитика начинается здесь!

Базовый метод выбора столбцов в Pandas DataFrame

Начнем с основ. Самый распространенный метод выбора нескольких столбцов в Pandas — использование двойных квадратных скобок с передачей списка имен столбцов. Это синтаксический сахар, делающий ваш код лаконичным и понятным.

Python
Скопировать код
import pandas as pd

# Создаем тестовый DataFrame
data = {
'Имя': ['Алексей', 'Мария', 'Иван', 'Елена'],
'Возраст': [28, 34, 22, 31],
'Город': ['Москва', 'Санкт-Петербург', 'Казань', 'Новосибирск'],
'Зарплата': [85000, 120000, 65000, 95000],
'Стаж': [3, 8, 1, 5]
}

df = pd.DataFrame(data)

# Выбираем несколько столбцов
result = df[['Имя', 'Возраст', 'Зарплата']]
print(result)

Этот код вернет DataFrame, содержащий только указанные столбцы в том порядке, в котором мы их перечислили. Порядок столбцов в результате будет соответствовать порядку в списке, что дает нам возможность не только выбирать, но и переупорядочивать столбцы.

Александр Петров, Lead Data Scientist

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

Python
Скопировать код
features = {
'демографические': ['возраст', 'пол', 'город'],
'транзакционные': ['сумма_покупки', 'частота_покупок', 'последняя_покупка'],
'поведенческие': ['время_на_сайте', 'просмотренные_категории']
}

# И теперь мог легко выбирать нужные группы
df_demo_trans = df[features['демографические'] + features['транзакционные']]

Это существенно упростило код и сделало его более поддерживаемым. Когда требования к модели менялись, я просто обновлял словарь, а не искал все места в коде, где использовались конкретные столбцы.

При работе с большими DataFrame важно понимать, что базовый метод создает копию данных, а не представление. Это может быть критично с точки зрения потребления памяти при работе с гигантскими датасетами.

Преимущества базового метода:

  • Интуитивно понятный синтаксис, легко читаемый даже новичками
  • Возможность переупорядочивать столбцы
  • Совместимость со всеми версиями Pandas

Недостатки:

  • Отсутствие встроенной возможности выбора по условию
  • Создание копии данных (потенциально затратно по памяти)
  • Ошибка KeyError при указании несуществующего столбца
Пошаговый план для смены профессии

Метод loc[] для выборки столбцов по именам

Метод loc[] — это мощный инструмент индексации в Pandas, позволяющий выбирать данные на основе меток строк и столбцов. В контексте выбора столбцов, loc[] предоставляет более гибкий и функциональный подход по сравнению с базовым методом.

Python
Скопировать код
# Выбираем столбцы с помощью loc[]
result_loc = df.loc[:, ['Имя', 'Возраст', 'Зарплата']]
print(result_loc)

# Можно также выбирать диапазон столбцов
result_range = df.loc[:, 'Имя':'Город']
print(result_range)

В первом примере мы используем двоеточие (:) для выбора всех строк, а затем список столбцов, которые нужно выбрать. Во втором примере мы выбираем диапазон столбцов от 'Имя' до 'Город' включительно.

Метод loc[] особенно полезен, когда вам нужно одновременно фильтровать строки и выбирать определенные столбцы:

Python
Скопировать код
# Выбираем строки, где возраст > 25, и только определенные столбцы
result_filtered = df.loc[df['Возраст'] > 25, ['Имя', 'Возраст', 'Зарплата']]
print(result_filtered)

Особенность loc[] Базовый метод
Синтаксис для выбора столбцов df.loc[:, ['col1', 'col2']] df[['col1', 'col2']]
Выбор диапазона столбцов Поддерживается (df.loc[:, 'start':'end']) Не поддерживается
Одновременная фильтрация строк Поддерживается Требует отдельного шага
Выбор по логическому массиву Поддерживается Не поддерживается напрямую
Производительность Немного медленнее для простых операций Быстрее для простых выборок

Метод loc[] превосходит базовый метод, когда дело доходит до сложных операций выборки. Например, вы можете использовать булевы массивы для выбора столбцов, соответствующих определенным условиям:

Python
Скопировать код
# Выбираем только числовые столбцы
numeric_columns = df.dtypes[df.dtypes != 'object'].index
result_numeric = df.loc[:, numeric_columns]
print(result_numeric)

Этот код выбирает все столбцы, которые имеют числовой тип данных, игнорируя строковые и другие нечисловые типы. 📊

Выбор столбцов с помощью iloc[] по позиции

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

Python
Скопировать код
# Выбираем столбцы по их позициям
result_iloc = df.iloc[:, [0, 1, 3]] # Выбираем первый, второй и четвертый столбцы
print(result_iloc)

# Выбор диапазона столбцов по позициям
result_range_iloc = df.iloc[:, 0:3] # Столбцы с индексами от 0 до 2 (не включая 3)
print(result_range_iloc)

Метод iloc[] следует принципам индексации Python — индексы начинаются с 0, а в диапазонах верхняя граница не включается. Это особенно важно помнить при переходе между loc[] и iloc[].

Выбор с помощью iloc[] особенно удобен в следующих случаях:

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

Рассмотрим пример, где iloc[] особенно полезен — когда вы хотите выбрать каждый n-й столбец:

Python
Скопировать код
# Выбираем каждый второй столбец
every_second_column = df.iloc[:, ::2]
print(every_second_column)

Этот код использует расширенную нотацию срезов Python [start:stop:step], где мы указываем шаг 2, чтобы выбрать столбцы с индексами 0, 2, 4 и так далее.

Наталья Соколова, Data Analyst

В одном из проектов по анализу медицинских данных мы столкнулись с ежедневными выгрузками, где порядок столбцов был всегда одинаковым, но их названия могли отличаться из-за особенностей системы учета. Например, одни и те же показатели могли называться "Гемоглобин (г/л)" или "HGB, g/L".

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

Python
Скопировать код
# Функция для стандартизации данных из любого источника
def standardize_data(df):
# Первые 5 столбцов – всегда идентификаторы пациента и время
# Столбцы 5-12 – всегда биохимические показатели
# Столбцы 13-20 – всегда показатели общего анализа крови

patient_info = df.iloc[:, 0:5]
biochem = df.iloc[:, 5:13]
blood_count = df.iloc[:, 13:21]

# Переименовываем столбцы к стандартным названиям
biochem.columns = ['glucose', 'cholesterol', 'hdl', 'ldl', 'alt', 'ast', 'bilirubin', 'creatinine']
blood_count.columns = ['wbc', 'rbc', 'hgb', 'hct', 'plt', 'neut', 'lymph', 'mono']

# Объединяем обратно
return pd.concat([patient_info, biochem, blood_count], axis=1)

Этот подход позволил нам обрабатывать данные из разных источников без необходимости постоянно адаптировать код под изменения в названиях.

Важно отметить, что при использовании iloc[] вы теряете явную связь с именами столбцов, что может сделать код менее читаемым и более хрупким при изменении структуры данных. Поэтому этот метод лучше использовать, когда порядок столбцов гарантированно стабилен или когда вы динамически определяете, какие позиции вам нужны.

Фильтрация столбцов с использованием регулярных выражений

Когда требуется выбрать столбцы, соответствующие определенному шаблону в их названиях, регулярные выражения становятся незаменимым инструментом. Pandas предоставляет метод filter(), который позволяет выбирать столбцы на основе их имен с использованием регулярных выражений или других условий.

Python
Скопировать код
# Создаем DataFrame с более сложной структурой столбцов
data_complex = {
'user_id': [1, 2, 3, 4],
'user_name': ['Алексей', 'Мария', 'Иван', 'Елена'],
'user_age': [28, 34, 22, 31],
'product_id': [101, 102, 103, 104],
'product_price': [1500, 2800, 950, 3200],
'order_date': ['2023-01-15', '2023-02-20', '2023-03-10', '2023-04-05']
}

df_complex = pd.DataFrame(data_complex)

# Выбираем все столбцы, начинающиеся с 'user_'
user_columns = df_complex.filter(regex='^user_')
print(user_columns)

Метод filter() с параметром regex позволяет указать регулярное выражение, которому должны соответствовать имена выбираемых столбцов. В примере выше мы выбираем все столбцы, начинающиеся с префикса "user_".

Другие полезные примеры использования регулярных выражений:

Python
Скопировать код
# Столбцы, содержащие слово 'price' в любой части названия
price_columns = df_complex.filter(regex='price')

# Столбцы, заканчивающиеся на '_id'
id_columns = df_complex.filter(regex='_id$')

# Столбцы, содержащие цифру в названии
numeric_name_columns = df_complex.filter(regex='\d')

Помимо regex, метод filter() также поддерживает другие способы фильтрации:

Python
Скопировать код
# Выбор по точному совпадению имен из списка
selected_columns = df_complex.filter(items=['user_id', 'product_id', 'order_date'])

# Выбор по осям (по умолчанию axis=0 – строки, axis=1 – столбцы)
column_filter = df_complex.filter(like='user', axis=1) # Столбцы, содержащие 'user'

Регулярное выражение Что ищет Пример столбцов, которые будут выбраны
^prefix Начинается с "prefix" prefix_name, prefix123
suffix$ Заканчивается на "suffix" name_suffix, 123suffix
pattern Содержит "pattern" namepatternid, mypattern
\d+ Содержит одну или более цифр column1, userid2, price3
[aeiou] Содержит любую гласную name, id, price (но не qty)
prefix_[a-z]+ Начинается с "prefix_" и содержит только строчные буквы после prefixname, prefixid (но не prefix_ID)

Использование регулярных выражений для выбора столбцов особенно полезно в следующих сценариях:

  • При работе с широкими датафреймами, где столбцы систематически именованы
  • При обработке данных с временными рядами, где столбцы могут содержать даты или периоды
  • Для группировки связанных столбцов (например, всех показателей для определенного типа измерений)
  • При работе с результатами операций one-hot encoding, где столбцы имеют общие префиксы

Обратите внимание, что использование регулярных выражений может быть медленнее других методов выборки столбцов, особенно для больших DataFrame. Поэтому если производительность критична, а шаблон выбора известен заранее, может быть лучше предварительно определить список нужных столбцов и использовать базовый метод. 🔍

Продвинутые техники выборки столбцов в Pandas

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

  1. Выбор столбцов на основе типов данных:
Python
Скопировать код
# Выбираем только числовые столбцы
numeric_cols = df.select_dtypes(include=['number'])

# Выбираем только строковые столбцы
string_cols = df.select_dtypes(include=['object'])

# Выбираем все, кроме определенных типов
non_numeric = df.select_dtypes(exclude=['number'])

Метод select_dtypes() особенно полезен при предварительной обработке данных, когда вы хотите применить различные преобразования к разным типам данных.

  1. Выбор столбцов с использованием функциональных фильтров:
Python
Скопировать код
# Выбираем столбцы, где более 50% значений не являются пропусками
non_null_cols = [col for col in df.columns if df[col].notna().mean() > 0.5]
result_non_null = df[non_null_cols]

# Выбираем столбцы с низкой кардинальностью (менее 10 уникальных значений)
low_cardinality_cols = [col for col in df.columns if df[col].nunique() < 10]
result_low_card = df[low_cardinality_cols]

  1. Комбинирование методов для сложных сценариев выборки:
Python
Скопировать код
# Выбираем числовые столбцы, начинающиеся с 'user_', где стандартное отклонение > 10
import numpy as np
numeric_cols = df.select_dtypes(include=['number']).columns
user_numeric_cols = [col for col in numeric_cols if col.startswith('user_') and df[col].std() > 10]
result_combined = df[user_numeric_cols]

  1. Использование индексных объектов для более гибкого выбора:
Python
Скопировать код
# Получаем объект индекса столбцов
columns = df.columns

# Различные операции с индексом
cols_sorted = sorted(columns)
cols_filtered = [col for col in columns if len(col) > 5]
cols_transformed = [col.upper() for col in columns]

# Применяем результат для выборки
result_index_ops = df[cols_filtered]

  1. Динамическое переупорядочивание столбцов:
Python
Скопировать код
# Перемещаем определенные столбцы в начало DataFrame
first_cols = ['Имя', 'Возраст']
other_cols = [col for col in df.columns if col not in first_cols]
reordered_df = df[first_cols + other_cols]

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

При работе с большими датасетами также важно учитывать эффективность операций выборки. Например, метод loc[] может быть медленнее для простых операций, но может быть оптимизирован при использовании с индексами. Аналогично, создание промежуточных списков столбцов может быть более эффективным, чем повторное применение сложных фильтров.

Наконец, стоит упомянуть о возможности создания многоуровневых столбцов с помощью MultiIndex:

Python
Скопировать код
# Создаем DataFrame с многоуровневыми столбцами
import numpy as np
arrays = [
['Пользователь', 'Пользователь', 'Продукт', 'Продукт'],
['ID', 'Имя', 'ID', 'Цена']
]
columns = pd.MultiIndex.from_arrays(arrays)
data = np.array([[1, 'Алексей', 101, 1500],
[2, 'Мария', 102, 2800]])
multi_df = pd.DataFrame(data, columns=columns)

# Выбор столбцов по уровням
user_info = multi_df['Пользователь']
product_ids = multi_df[('Продукт', 'ID')]

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

Pandas предлагает гибкую экосистему методов для выбора столбцов, от базовых до продвинутых. Ключевой момент — понимать, какой метод оптимален для конкретной задачи. Базовые двойные скобки идеальны для простых сценариев, loc[] и iloc[] раскрывают свою мощь при сложной индексации и фильтрации, регулярные выражения незаменимы при работе с систематически названными столбцами, а продвинутые техники, такие как select_dtypes(), открывают новые горизонты анализа. Владение этими методами не просто улучшает ваш код — оно трансформирует ваше мышление как аналитика данных, позволяя видеть и извлекать паттерны, скрытые в необработанных данных.

Загрузка...