2017-09-15 40 views
0

我有一個雙重索引(日期,時間)的數據框,並且如果索引日屬於假期列表,則希望創建等於一個新列的「假日」 。在熊貓中創建日期列表的虛擬值

我喜歡的類型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 ...

提前感謝!

回答

1

使用isinget_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 
+0

你很幸運,這是我,而不是用相同的解決方案,你做之前誰字面上發佈秒你的別人。 ;-) –

+0

嗯,在某個地方我覺得np.where與astype(int)完全不一樣,顯然我們都是在'isin'部分獨立的,它<30secs是什麼? – Zero

+0

非常感謝! – Batmax

1

您當前的解決方案實際上應該拋出ValueError

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

注意,in經營者是指對標量值,並不意味着與大熊貓dataframes使用。相反,熊貓有許多重載的條件運算符和位運算符,以及一組用於條件邏輯和布爾邏輯的綜合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