You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中按多种模式选取多列的地道写法?以nycflights13为例

问题描述

我正尝试用Python的pandas复现R语言《R for Data Science》(R4DS)中dplyr的练习,使用nycflights13.flights数据集。需要从该数据集中选取以下几类列:

  • 从year到day的连续列(包含首尾);
  • 所有以"delay"结尾的列;
  • distance和air_time列。

书中Hadley使用的R语法实现:

library("tidyverse")
library("nycflights13")

flights_sml <- select(flights,
   year:day,
   ends_with("delay"),
   distance,
   air_time
)

我自己写出了两种pandas实现方式:
第一种:

import pandas as pd
from nycflights13 import flights

flights_sml = pd.concat([
    flights.loc[:, 'year':'day'],
    flights.loc[:, flights.columns.str.endswith("delay")],
    flights.distance,
    flights.air_time,
], axis=1)

第二种:

flights_sml = flights.filter(regex='year|day|month|delay$|^distance$|^air_time$', axis=1)

但我认为这两种写法都不符合pandas的惯用风格,想请教更地道的写法。

地道的pandas实现方式

可以通过构造目标列列表的方式实现,逻辑和dplyr的select语法对齐,同时符合pandas的惯用风格:

import pandas as pd
from nycflights13 import flights

# 1. 获取year到day的连续列
continuous_cols = flights.loc[:, 'year':'day'].columns.tolist()
# 2. 获取所有以delay结尾的列
delay_cols = flights.columns[flights.columns.str.endswith('delay')].tolist()
# 3. 指定需要单独选择的列
specified_cols = ['distance', 'air_time']

# 合并所有目标列
target_cols = continuous_cols + delay_cols + specified_cols

# 选择列得到结果
flights_sml = flights[target_cols]

这种写法的优势:

  • 逻辑清晰,和R语言中select的参数一一对应,可读性强;
  • 直接使用pandas的列索引方式,是最常用的选列操作之一;
  • 便于后续维护,比如要调整选列规则时,只需修改对应部分的代码。

如果偏好流式代码风格,也可以用链式写法贴近tidyverse的管道逻辑:

flights_sml = (flights
               .pipe(lambda df: df.loc[:, 'year':'day']
                     .join(df.loc[:, df.columns.str.endswith('delay')])
                     .join(df[['distance', 'air_time']]))
              )

内容的提问来源于stack exchange,提问作者Pedro Vinícius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:54:22