【发布时间】:2018-02-20 01:16:14
【问题描述】:
我会尽力解释我的问题。我有一个 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,“小时”包含 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
}
我需要创建一个新列,该列将根据 groupby(或可能不是)“工作”和“小时”之后的每个小时是否工作或不工作天 (0, 1) 映射两个字典:
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
【问题讨论】:
-
你能展示一下,预期的输出是什么?
-
最后一个例子是我预期的输出伙伴
-
df=pd.DataFrame({'hour_work':list(hour_work.values()),'hour_notwork':list(hour_notwork.values()),'hour':list(hour_work.keys())})然后pd.melt(df,'hour').set_index('variable') -
不如预期的伙伴,我的数据框有其他列(功能)。因此,我正在寻找仅按“工作”和“小时”进行的一些分组,以根据工作值映射到字典,如果是 1-映射小时从 0-23 与 hour_work 字典和同一新列中的所有映射。也许是一个 if 语句,dunoo :(
-
如果涉及更多数据,请提供更详尽的解释和示例
标签: pandas dictionary pandas-groupby