0Pricing
Pandas & NumPy Academy · 课时

按模式选择列

使用 filter(like=)、filter(regex=) 和列表推导式,选择名称符合特定模式的列。

按模式选择列 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

为什么要按模式选择列?

来自真实数据源的 DataFrame 往往包含几十列甚至数百列,而您很少需要使用全部列。当列名遵循某种命名约定时,例如以 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() 方法是按后缀选择列的最简洁方式。Pandas 的 Index 对象支持 .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' 会选择所有数值列(整数和浮点数),传入 include='object' 会选择字符串列,传入 include='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

在行索引上使用 axis=0 调用 filter()

默认情况下,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=) 使用正则表达式进行灵活的模式匹配,而对 df.columns 使用列表推导式并结合 Python 字符串方法可以提供最大的灵活性。使用 select_dtypes() 可按数据类型选择列。接下来,我们将学习如何检测 DataFrames 中的缺失值(NaN)。

常见问题解答

「按模式选择列」课时是免费的吗?

是的 — 「按模式选择列」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「按模式选择列」这节课中我会学到什么?

使用 filter(like=)、filter(regex=) 和列表推导式,选择名称符合特定模式的列。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「按模式选择列」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. DataFrames 上的布尔索引
  2. query() 方法
  3. isin() 与 between() 筛选
  4. 按模式选择列
← 返回 Pandas & NumPy Academy