我正在尝试使用Python的pandas
复制R4DS的一些dplyr
练习,使用nycflights13.flights
数据集。我想做的是从该数据集中选择:
- 列到
year
到day
(含); - 所有以"延迟"结尾的列;
distance
和air_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