Pandas & NumPy Academy · Урок

Выбор столбцов по шаблону

Используйте filter(like=), filter(regex=) и списковые включения, чтобы выбрать столбцы, соответствующие шаблону имени.

Урок 4 из 413 шагов

«Выбор столбцов по шаблону» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Зачем выбирать столбцы по шаблону?

DataFrames из реальных источников часто содержат десятки или сотни столбцов, хотя обычно нужны далеко не все. Если имена столбцов соответствуют соглашению — например, содержат префиксы вроде sales_, суффиксы вроде _2023 или определённые ключевые слова, — выбор по шаблону имени гораздо удобнее в сопровождении, чем явное перечисление каждого столбца. При изменении схемы выбор по шаблону автоматически адаптируется.

Pandas предоставляет два основных инструмента: метод filter() и списковые включения для df.columns.

import pandas as pd

df = pd.DataFrame({
    'sales_jan': [100, 200],
    'sales_feb': [150, 250],
    'cost_jan': [50, 80],
    'cost_feb': [60, 90],
    'profit': [140, 280]
})

print(df.columns.tolist())
# ['sales_jan', 'sales_feb', 'cost_jan', 'cost_feb', 'profit']

filter(like=) для поиска подстроки

DataFrame.filter(like='substring') выбирает столбцы, имена которых содержат указанную подстроку в любом месте (с учётом регистра). По умолчанию метод работает по оси столбцов и возвращает новый DataFrame только с подходящими столбцами.

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

import pandas as pd

df = pd.DataFrame({
    'sales_jan': [100, 200],
    'sales_feb': [150, 250],
    'cost_jan': [50, 80],
    'revenue_q1': [110, 210]
})

# Select columns whose name contains 'sales'
sales_cols = df.filter(like='sales')
print(sales_cols)
#    sales_jan  sales_feb
# 0        100        150
# 1        200        250

filter(regex=) для поиска по шаблону

DataFrame.filter(regex='pattern') выбирает столбцы, имена которых соответствуют указанному регулярному выражению. Этот способ мощнее like=, поскольку регулярные выражения позволяют сопоставлять префиксы, суффиксы, позиции цифр и сложные шаблоны. Регулярное выражение сопоставляется с любой частью имени столбца, а не только с его началом.

import pandas as pd

df = pd.DataFrame({
    'q1_revenue': [100],
    'q2_revenue': [200],
    'q1_cost': [40],
    'q2_cost': [60],
    'annual_total': [360]
})

# Select columns ending with '_revenue'
revenue_cols = df.filter(regex='_revenue$')
print(revenue_cols)
#    q1_revenue  q2_revenue
# 0         100         200

# Select columns starting with 'q' (quarter columns)
quarter_cols = df.filter(regex='^q')
print(quarter_cols.columns.tolist())
# ['q1_revenue', 'q2_revenue', 'q1_cost', 'q2_cost']

Списковое включение для df.columns

Для максимальной гибкости перебирайте df.columns с помощью спискового включения и применяйте любой строковый метод Python для построения списка столбцов. Этот способ подходит для startswith, endswith, contains, проверки длины строки и любой пользовательской логики, которую нельзя выразить только регулярным выражением.

import pandas as pd

df = pd.DataFrame({
    'age': [25, 30],
    'age_group': ['young', 'mid'],
    'income': [50000, 70000],
    'income_tax': [8000, 12000],
    'name': ['Alice', 'Bob']
})

# Select columns that start with 'income'
income_cols = [c for c in df.columns if c.startswith('income')]
print(df[income_cols])
#    income  income_tax
# 0   50000        8000
# 1   70000       12000

Выбор по суффиксу имени столбца

Метод str.endswith() у индекса столбцов — самый понятный способ выбирать столбцы по суффиксу. Объекты Index в Pandas поддерживают методы доступа .str, поэтому строковые операции можно применить сразу ко всем именам столбцов, а полученный булев массив использовать для среза DataFrame.

import pandas as pd

df = pd.DataFrame({
    'revenue_2022': [100],
    'cost_2022': [40],
    'revenue_2023': [150],
    'cost_2023': [55],
    'notes': ['ok']
})

# Use Index.str.endswith for suffix selection
cols_2023 = df.columns[df.columns.str.endswith('_2023')]
print(df[cols_2023])
#    revenue_2023  cost_2023
# 0           150         55

Удаление столбцов по шаблону

Иногда проще исключить набор столбцов, чем перечислять те, которые нужно оставить. Объедините выбор по шаблону с drop() или используйте дополнение: составьте список удаляемых столбцов, а затем вызовите df.drop(columns=cols_to_drop). Также можно получить столбцы, которые Вы не хотите оставлять, и передать их в drop.

import pandas as pd

df = pd.DataFrame({
    'id': [1, 2],
    'name': ['A', 'B'],
    'temp_col1': [0, 0],
    'temp_col2': [0, 0],
    'score': [90, 80]
})

# Drop columns whose name starts with 'temp_'
temp_cols = [c for c in df.columns if c.startswith('temp_')]
cleaned = df.drop(columns=temp_cols)
print(cleaned)
#    id name  score
# 0   1    A     90
# 1   2    B     80

Выбор числовых столбцов с помощью select_dtypes

Если нужно выбрать столбцы определённого типа данных, а не по шаблону имени, используйте df.select_dtypes(include=). Аргумент include='number' выбирает все числовые столбцы (int и float), include='object' — строковые столбцы, а include='datetime' — столбцы datetime.

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

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [25, 30],
    'salary': [50000.0, 70000.0],
    'dept': ['Eng', 'HR']
})

# Select only numeric columns
numeric_df = df.select_dtypes(include='number')
print(numeric_df)
#    age   salary
# 0   25  50000.0
# 1   30  70000.0

# Exclude numeric columns
text_df = df.select_dtypes(exclude='number')
print(text_df)
#     name dept
# 0  Alice  Eng
# 1    Bob   HR

filter() для индекса строк с axis=0

По умолчанию filter() работает со столбцами (axis=1). Но с его помощью можно также фильтровать строки по метке индекса, передав axis=0. Это полезно, когда DataFrame имеет информативные строковые метки индекса и нужно выбрать строки, чья метка соответствует шаблону, — менее распространённый, но удобный приём.

import pandas as pd

df = pd.DataFrame({
    'value': [10, 20, 30, 40]
}, index=['alpha_a', 'beta_b', 'alpha_c', 'gamma_d'])

# Filter rows by index label pattern
alpha_rows = df.filter(like='alpha', axis=0)
print(alpha_rows)
#          value
# alpha_a     10
# alpha_c     30

Объединение шаблонов выбора столбцов

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

import pandas as pd

df = pd.DataFrame(columns=[
    'user_id', 'user_name', 'user_email',
    'product_id', 'product_name', 'product_price',
    'order_total', 'order_date'
])

# Step 1: columns that start with 'user_' or 'order_'
step1 = [c for c in df.columns if c.startswith('user_') or c.startswith('order_')]

# Step 2: exclude email (PII)
final_cols = [c for c in step1 if 'email' not in c]
print(final_cols)
# ['user_id', 'user_name', 'order_total', 'order_date']

Изменение порядка столбцов по шаблону

Выбор по шаблону полезен и для изменения порядка столбцов. Сначала выберите нужные столбцы (например, ID и метаданные), затем добавьте остальные столбцы в определённом порядке. Изменение порядка упрощает чтение DataFrame и обеспечивает единообразную структуру результатов.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'metric_b': [1], 'metric_a': [2],
    'id': [10], 'label': ['x'],
    'metric_c': [3]
})

# Put id and label first, then sort metric columns alphabetically
id_cols = ['id', 'label']
metric_cols = sorted([c for c in df.columns if c.startswith('metric')])
ordered = df[id_cols + metric_cols]
print(ordered.columns.tolist())
# ['id', 'label', 'metric_a', 'metric_b', 'metric_c']

Практический пример: широкие данные опроса

Классический пример применения выбора по шаблону — широкий набор данных опроса, где каждый вопрос порождает несколько столбцов, например q1_score, q1_text, q2_score и так далее. Все столбцы с оценками можно извлечь одним регулярным выражением, вычислить их среднее и хранить столбцы для анализа отдельно от ответов в свободной форме.

import pandas as pd

survey = pd.DataFrame({
    'respondent_id': [1, 2, 3],
    'q1_score': [4, 3, 5],
    'q2_score': [3, 4, 4],
    'q3_score': [5, 5, 3],
    'q1_comment': ['good', 'ok', 'great'],
    'q2_comment': ['fine', 'nice', 'meh']
})

# All score columns
score_cols = survey.filter(regex='_score$').columns
survey['avg_score'] = survey[score_cols].mean(axis=1)
print(survey[['respondent_id', 'avg_score']])
#    respondent_id  avg_score
# 0              1   4.000000
# 1              2   4.000000
# 2              3   4.000000

Быстрая проверка

Проверьте, насколько хорошо Вы умеете выбирать столбцы по шаблону.

Итоги урока

В этом уроке Вы узнали: filter(like=) выбирает столбцы, содержащие подстроку, filter(regex=) использует регулярные выражения для гибкого сопоставления с шаблоном, а list comprehensions on df.columns вместе со строковыми методами Python обеспечивают максимальную гибкость. Используйте select_dtypes(), чтобы выбирать данные по типу. Далее мы рассмотрим обнаружение пропущенных значений (NaN) в DataFrames.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Выбор столбцов по шаблону» бесплатный?

Да — полный текст урока «Выбор столбцов по шаблону» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Выбор столбцов по шаблону»?

Используйте filter(like=), filter(regex=) и списковые включения, чтобы выбрать столбцы, соответствующие шаблону имени. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Выбор столбцов по шаблону»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Булева индексация DataFrames
  2. Метод query()
  3. Фильтры isin() и between()
  4. Выбор столбцов по шаблону
← Назад к Pandas & NumPy Academy