Pandas多索引并映射两个单独的词典

时间:2017-09-11 17:59:57

标签: pandas dictionary pandas-groupby

我会尽力解释我的问题。我有一个DataFrame,每年每小时有几列和8780行。每行包含:

day   work   hour   ...etc
1      0      0
1      0      1
1      0      2
  ...
3      1      0
3      1      1
  ...
3      1      23

两栏'工作' 0和1&1'小时'数字从00-23。我想创建具有特定组的新列,例如:

hour_work = {0:2, 1:2, 
        2:1, 3:1, 4:1, 5:1, 6:1,  
        7:3, 8:3, 
        9:4, 10:4, 11:4,  
        12:5,
        13:4, 14:4, 15:4, 16:4,
        17:3, 18:3, 19:3, 20:3, 21:3, 
        22:1, 23:1}

hour_notwork = {0:2, 1:2, 
        2:1, 3:1, 4:1, 5:1, 6:1,  
        7:3, 8:3,   
        9:4, 10:4, 11:4,  
        12:5, 13:5,
        14:4, 15:4, 16:4, 17:3, 18:3, 19:3, 
        20:2, 21:2, 22:2, 23:2
        }

我需要创建一个新列,根据它是否工作或不工作日(0,1)在groupby(或可能不是)' work&#39后的每个小时映射两个词典;和'小时':

df['hour_group'] = df.groupby(['work', 'hour']).apply(work_func). #where in work is 1
df['hour_group'] = df.groupby(['work', 'hour']).apply(not_work_func). #where in work is 0

所需的输出应该是这样的(根据工作,小时和两个词典创建新列):

day    work  hour    hour_group
1      0      0       2
1      0      1       2
1      0      2       1
1      0      3       1
1      0      4       1
1      0      5       1
1      0      6       1
1      0      7       3
1      0      8       3
1      0      9       4
1      0      10      4
1      0      11      4
1      0      12      5
1      0      13      4
1      0      14      4
1      0      15      4
1      0      16      4
1      0      17      3
1      0      18      3
1      0      19      3
1      0      20      3
1      0      21      2
1      0      22      2
1      0      23      2

....   

3      1     0       2
3      1     1       2
3      1     2       2
3      1     3       1
3      1     4       1
3      1     5       1
3      1     6       1
3      1     7       3
3      1     8       3
3      1     9       3
3      1     10      3
3      1     11      3
3      1     12      4
3      1     13      4
3      1     14      4
3      1     15      4
3      1     16      5
3      1     17      5
3      1     18      3
3      1     19      3
3      1     20      3
3      1     21      2
3      1     22      2
3      1     23      1

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法:

{{1}}