在熊猫中,根据不同的模式选择多个列的惯用方法是什么?



我正在尝试使用Python的pandas复制R4DS的一些dplyr练习,使用nycflights13.flights数据集。我想做的是从该数据集中选择:

  • 列到yearday(含);
  • 所有以"延迟"结尾的列;
  • distanceair_time

在书中,哈德利使用了以下语法:

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

在熊猫中,我想出了以下"解决方案":

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)

但我敢肯定这不是编写这种 DF操作的惯用方法。我四处挖掘,但还没有从 API 中找到适合这种情况pandas的东西。

你是对的。这将创建多个数据帧/系列,然后将它们连接在一起,从而导致大量额外的工作。相反,您可以创建要使用的列列表,然后只需选择这些列。

例如(保持相同的列顺序):

cols = ['year', 'month', 'day'] + [col for col in flights.columns if col.endswith('delay')] + ['distance', 'air_time']
flights_sml = flights[cols]

根据数据集的列信息,我们可以利用str.contains

df.loc[:, df.columns.str.contains('year|month|day|delay|distance|air_time')]
year  month  day  dep_delay  arr_delay  air_time  distance
0  2013      1    1        2.0       11.0     227.0      1400
1  2013      1    1        4.0       20.0     227.0      1416
2  2013      1    1        2.0       33.0     160.0      1089
3  2013      1    1       -1.0      -18.0     183.0      1576
4  2013      1    1       -6.0      -25.0     116.0       762

一种选择是使用 pyjanitor 的 select_columns:

# pip install pyjanitor
import pandas as pd 
import janitor
from nycflights13 import flights
flights_sml = flights.select_columns(
slice('year', 'day'), 
'*delay', 
'distance', 
'air_time'
)
flights_sml.head()
year  month  day  dep_delay  arr_delay  distance  air_time
0  2013      1    1        2.0       11.0      1400     227.0
1  2013      1    1        4.0       20.0      1416     227.0
2  2013      1    1        2.0       33.0      1089     160.0
3  2013      1    1       -1.0      -18.0      1576     183.0
4  2013      1    1       -6.0      -25.0       762     116.0

最新更新