如何用Pandas创建工作日7:00-17:00的时间序列布尔哑变量?
解决方案:创建工作日7:00-17:00的布尔哑变量
报错原因
你在apply的lambda里调用df.index.weekday <=4时,这是对整个DataFrame索引的批量判断,返回的是布尔数组;而lambda中的hr是单个值,两者做逻辑判断会触发歧义错误(数组的真值无法直接判定)。
正确实现方法
方法一:矢量化操作(推荐,效率更高)
直接基于索引的属性做批量逻辑判断,无需逐行迭代:
# 利用索引的hour和weekday属性生成布尔条件,转成0/1整数 df['7AM_to_5PM'] = ((df.index.hour > 7) & (df.index.hour < 17) & (df.index.weekday <= 4)).astype(int)
- 逻辑与操作要用
&(Pandas数组的逻辑运算符),不能用Python的and - 最后用
astype(int)把布尔值转成1/0的哑变量
方法二:逐行apply(不推荐,适合理解逻辑)
如果一定要用apply,需要指定axis=1逐行处理,通过row.name获取当前行的索引:
df['hour'] = df.index.hour # 直接用索引的hour属性,无需转字符串再转整数 df['7AM_to_5PM'] = df.apply(lambda row: 1 if (row['hour'] >7 and row['hour'] <17 and row.name.weekday <=4) else 0, axis=1)
最终使用
生成绘图用DataFrame的代码无需修改:
df_scatter = df[['oat','electricity','7AM_to_5PM']]
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

