2017-09-14 154 views
1

我有一個雙指數(日期,時間)的數據框,並希望創建'星期一','星期二','星期三'等新的列等於一個如果指數日在正確的一天。Python根據雙指數的星期幾創建虛擬變量

我原來的數據幀:

     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  Monday Tuesday 
Date  Time                
2017-09-11 4:45   0   1   0 
      5:00   1   1   0 
      5:15   26   1   0 
.... 
2017-09-12 4:45   0   0   1 
      5:00   1   0   1 
      5:15   26   0   1 
.... 

這裏是我的嘗試:

df['Monday'] = (df.index.get_level_values(0).weekday() == 0) 

不過,我得到一個錯誤說「」 Int64Index'對象不可調用「。

在此先感謝!

回答

1

你需要從刪除()

df['Monday'] = (df.index.get_level_values(0).weekday == 0).astype(int) 

print (df) 
       Visitor Monday 
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 

names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 

for i, x in enumerate(names): 
    df[x] = (df.index.get_level_values(0).weekday == i).astype(int) 
print (df) 
       Visitor Monday Tuesday Wednesday Thursday Friday \ 
Date  Time               
2017-09-11 4:45  0  1  0   0   0  0 
      5:00  1  1  0   0   0  0 
      5:15  26  1  0   0   0  0 
2017-09-12 4:45  0  0  1   0   0  0 
      5:00  1  0  1   0   0  0 
      5:15  26  0  1   0   0  0 

       Saturday Sunday 
Date  Time      
2017-09-11 4:45   0  0 
      5:00   0  0 
      5:15   0  0 
2017-09-12 4:45   0  0 
      5:00   0  0 
      5:15   0  0 

另一種解決方案是提高其他原稿answer - 需要DatetimeIndex.weekday_nameget_dummies,然後set_index由原始索引,必要時添加重建索引的附加missig名稱:

names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 

df1 = df.join(pd.get_dummies(df.index.get_level_values(0).weekday_name) 
       .set_index(df.index).reindex(columns=names, fill_value=0)) 
print (df1) 
       Visitor Monday Tuesday Wednesday Thursday Friday \ 
Date  Time               
2017-09-11 4:45  0  1  0   0   0  0 
      5:00  1  1  0   0   0  0 
      5:15  26  1  0   0   0  0 
2017-09-12 4:45  0  0  1   0   0  0 
      5:00  1  0  1   0   0  0 
      5:15  26  0  1   0   0  0 

       Saturday Sunday 
Date  Time      
2017-09-11 4:45   0  0 
      5:00   0  0 
      5:15   0  0 
2017-09-12 4:45   0  0 
      5:00   0  0 
      5:15   0  0 
1

使用get_dummiesweekday_name

In [293]: df.join(pd.get_dummies(df.index.get_level_values(0).weekday_name) 
        .set_index(df.index)) 
Out[293]: 
       Visitor Monday Tuesday 
Date  Time 
2017-09-11 4:45  0  1  0 
      5:00  1  1  0 
      5:15  26  1  0 
2017-09-12 4:45  0  0  1 
      5:00  1  0  1 
      5:15  26  0  1 

In [272]: pd.get_dummies(df.index.get_level_values(0).weekday_name) 
Out[272]: 
    Monday Tuesday 
0  1  0 
1  1  0 
2  1  0 
3  0  1 
4  0  1 
5  0  1 

詳細

In [286]: df.index.get_level_values(0).weekday_name 
Out[286]: Index([u'Monday', u'Monday', u'Monday', u'Tuesday', u'Tuesday', u'Tuesday'], dtype='object', name=u'Date') 
+0

非常感謝你認爲非常完美的! :) – Batmax