为pandas

时间:2017-09-15 11:38:25

标签: python pandas dataframe dummy-variable

我有一个带有双索引(日期,时间)的数据框,并希望创建一个新列'假日'如果索引日属于假期列表,则等于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 ...

提前致谢!

2 个答案:

答案 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