我有一个带有双索引(日期,时间)的数据框,并希望创建一个新列'假日'如果索引日属于假期列表,则等于1。
我的DatetimeIndex类型的假期列表:
holidays = ['2017-09-11', '2017-12-24']
我的原始数据框:
Visitor
Date Time
2017-09-11 4:45 0
5:00 1
5:15 26
....
2017-09-12 4:45 0
5:00 1
5:15 26
....
我想拥有什么:
Visitor Holiday
Date Time
2017-09-11 4:45 0 1
5:00 1 1
5:15 26 1
....
2017-09-12 4:45 0 0
5:00 1 0
5:15 26 0
....
以下是我根据此previous answer尝试的内容:
df['Holiday'] = int(df.index.get_level_values(0) in holidays == True)
然而,我的专栏'假日'始终具有值0 ...
提前致谢!
答案 0 :(得分:2)
您当前的解决方案实际上应该抛出DocumentFile
:
ValueError
请注意,ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
运算符用于标量值,不适用于pandas数据帧。相反,pandas有很多重载的条件和位运算符,以及用于条件和布尔逻辑的全面API套件。
您可以使用 in
和 np.where
。
isin
答案 1 :(得分:2)
通过从isin
获取日期级别并使用get_level_values
将布尔值转换为整数来使用astype(int)
。
In [192]: df['Holiday'] = df.index.get_level_values(0).isin(holidays).astype(int)
In [193]: df
Out[193]:
Visitor Holiday
Date Time
2017-09-11 4:45 0 1
5:00 1 1
5:15 26 1
2017-09-12 4:45 0 0
5:00 1 0
5:15 26 0
如果您想要副本而不是修改df
In [196]: df.assign(Holiday=df.index.get_level_values(0).isin(holidays).astype(int))
Out[196]:
Visitor Holiday
Date Time
2017-09-11 4:45 0 1
5:00 1 1
5:15 26 1
2017-09-12 4:45 0 0
5:00 1 0
5:15 26 0