Python根据双指数的星期几创建虚拟变量

问题描述:

我有一个双指数(日期,时间)的数据框,并希望创建'星期一','星期二','星期三'等新的列等于一个如果指数日在正确的一天。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'对象不可调用“。

在此先感谢!

你需要从删除()

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 

使用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