在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
相关产品推荐
相关产品推荐

