5 мощных техник выбора столбцов в Pandas для анализа данных
Для кого эта статья:
- Аналитики данных, работающие с Pandas
- Студенты и начинающие специалисты в области анализа данных
Профессионалы, стремящиеся улучшить свои навыки выборки данных в Pandas
Манипуляция данными в Pandas часто напоминает хирургическую операцию — точность здесь критична. Выбор нескольких столбцов из DataFrame — одна из тех фундаментальных операций, которую каждый аналитик данных выполняет десятки раз в день. Несмотря на кажущуюся простоту, неправильный подход к выборке столбцов может привести к раздутому коду, снижению производительности или даже неверным результатам анализа. В этой статье мы вооружим вас пятью мощными техниками, которые превратят вашу работу с DataFrame из рутины в искусство. 🔍
Освоение библиотеки Pandas — лишь верхушка айсберга в арсенале современного аналитика данных. На курсе Профессия аналитик данных от Skypro вы не только детально изучите все инструменты для обработки данных, но и научитесь применять их в реальных проектах под руководством действующих экспертов. Вместо долгих лет самостоятельного освоения — 9 месяцев структурированного обучения с гарантированным трудоустройством. Ваш путь к профессии аналитика начинается здесь!
Базовый метод выбора столбцов в Pandas DataFrame
Начнем с основ. Самый распространенный метод выбора нескольких столбцов в Pandas — использование двойных квадратных скобок с передачей списка имен столбцов. Это синтаксический сахар, делающий ваш код лаконичным и понятным.
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[] предоставляет более гибкий и функциональный подход по сравнению с базовым методом.
# Выбираем столбцы с помощью loc[]
result_loc = df.loc[:, ['Имя', 'Возраст', 'Зарплата']]
print(result_loc)
# Можно также выбирать диапазон столбцов
result_range = df.loc[:, 'Имя':'Город']
print(result_range)
В первом примере мы используем двоеточие (:) для выбора всех строк, а затем список столбцов, которые нужно выбрать. Во втором примере мы выбираем диапазон столбцов от 'Имя' до 'Город' включительно.
Метод loc[] особенно полезен, когда вам нужно одновременно фильтровать строки и выбирать определенные столбцы:
# Выбираем строки, где возраст > 25, и только определенные столбцы
result_filtered = df.loc[df['Возраст'] > 25, ['Имя', 'Возраст', 'Зарплата']]
print(result_filtered)
| Особенность | loc[] | Базовый метод |
|---|---|---|
| Синтаксис для выбора столбцов | df.loc[:, ['col1', 'col2']] | df[['col1', 'col2']] |
| Выбор диапазона столбцов | Поддерживается (df.loc[:, 'start':'end']) | Не поддерживается |
| Одновременная фильтрация строк | Поддерживается | Требует отдельного шага |
| Выбор по логическому массиву | Поддерживается | Не поддерживается напрямую |
| Производительность | Немного медленнее для простых операций | Быстрее для простых выборок |
Метод loc[] превосходит базовый метод, когда дело доходит до сложных операций выборки. Например, вы можете использовать булевы массивы для выбора столбцов, соответствующих определенным условиям:
# Выбираем только числовые столбцы
numeric_columns = df.dtypes[df.dtypes != 'object'].index
result_numeric = df.loc[:, numeric_columns]
print(result_numeric)
Этот код выбирает все столбцы, которые имеют числовой тип данных, игнорируя строковые и другие нечисловые типы. 📊
Выбор столбцов с помощью iloc[] по позиции
В отличие от loc[], который работает с метками, метод iloc[] оперирует целочисленными позициями строк и столбцов. Это делает его идеальным инструментом, когда вы знаете расположение нужных столбцов, а не их имена, или когда позиции более удобны для программной манипуляции.
# Выбираем столбцы по их позициям
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-й столбец:
# Выбираем каждый второй столбец
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(), который позволяет выбирать столбцы на основе их имен с использованием регулярных выражений или других условий.
# Создаем 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_".
Другие полезные примеры использования регулярных выражений:
# Столбцы, содержащие слово '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() также поддерживает другие способы фильтрации:
# Выбор по точному совпадению имен из списка
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 существуют более продвинутые методы выборки столбцов, которые могут значительно упростить код и повысить его эффективность в сложных сценариях анализа данных.
- Выбор столбцов на основе типов данных:
# Выбираем только числовые столбцы
numeric_cols = df.select_dtypes(include=['number'])
# Выбираем только строковые столбцы
string_cols = df.select_dtypes(include=['object'])
# Выбираем все, кроме определенных типов
non_numeric = df.select_dtypes(exclude=['number'])
Метод select_dtypes() особенно полезен при предварительной обработке данных, когда вы хотите применить различные преобразования к разным типам данных.
- Выбор столбцов с использованием функциональных фильтров:
# Выбираем столбцы, где более 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]
- Комбинирование методов для сложных сценариев выборки:
# Выбираем числовые столбцы, начинающиеся с '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]
- Использование индексных объектов для более гибкого выбора:
# Получаем объект индекса столбцов
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]
- Динамическое переупорядочивание столбцов:
# Перемещаем определенные столбцы в начало 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:
# Создаем 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(), открывают новые горизонты анализа. Владение этими методами не просто улучшает ваш код — оно трансформирует ваше мышление как аналитика данных, позволяя видеть и извлекать паттерны, скрытые в необработанных данных.