【问题标题】:Create dummy values for a list of dates in pandas为 pandas 中的日期列表创建虚拟值
【发布时间】:2017-09-15 11:38:24
【问题描述】:

我有一个带有双索引(天、时间)的数据框,如果索引天属于假期列表,我想创建一个等于一的新列“假期”。

我的 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...

提前致谢!

【问题讨论】:

    标签: python pandas dataframe dummy-variable


    【解决方案1】:

    通过从get_level_values 获取日期级别来使用isin,并使用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
    

    【讨论】:

    • 你很幸运,是我,而不是其他人,与你有相同的解决方案,比你早几秒钟发布。 ;-)
    • 嗯,在某个地方我觉得 np.where 和 astype(int) 很不一样,显然我们俩在isin 部分是独立的,它是什么
    • @Batmax 你可以对这两种解决方案投赞成票,它们本质上是一样的。
    【解决方案2】:

    您当前的解决方案实际上应该抛出一个ValueError

    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    

    请注意,in 运算符适用于标量值,不适用于 pandas 数据帧。 pandas 反而有许多重载的条件和位运算符,以及用于条件和布尔逻辑的全面 API 套件。


    您可以使用 np.whereisin

    df['Holiday'] = np.where(df.index.get_level_values(0).isin(holidays), 1, 0)
    df
    
    
                     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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多