我有一个pandas数据帧df
和一个日期时间数组holidays
df.head()
date hour count Relative Humidity Temperature Precipitation dow
0 2019-07-01 0 672 57.64 71.8 0.0 Monday
1 2019-07-01 1 359 61.61 70.8 0.0 Monday
2 2019-07-01 2 197 61.63 69.8 0.0 Monday
3 2019-07-01 3 115 63.32 69.0 0.0 Monday
4 2019-07-01 4 168 67.91 67.9 0.0 Monday
df.dtypes
date object
hour int64
count int64
Relative Humidity float64
Temperature float64
Precipitation float64
dow object
dtype: object
holidays
[datetime.date(2019, 9, 2), datetime.date(2019, 7, 4)]
我的目标是创建一个新列,指示日期是否为工作日,但下面的if-else语句会抛出错误:
df['is_workday'] = df.apply(lambda row: False if (row['dow'] in ('Saturday', 'Sunday') | pd.to_datetime(row['date'], format='%Y-%m-%d') in holidays) else True)
KeyError: 'dow'
是什么原因导致了这个问题?
默认情况下,df.apply(...)
应用于列。要在每行上应用lambda,请指定:
df.apply(..., axis=1)
除此之外,这看起来效率很低,而且在没有任何lambda的情况下可以更快地实现。一种更有效的方法是向量化您的逻辑:
cond_wkend = df['dow'].isin({'Saturday', 'Sunday'})
cond_holdy = pd.to_datetime(df['date']).isin(holidays)
df['is_workday'] = ~(cond_wkend | cond_holdy)