带有if-else语句的lambda行函数



我有一个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)

最新更新