按模式选择列
使用 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 反馈 — 无需本地设置。