【问题标题】:Pandas multi-index and map two separate dictionariesPandas 多索引和映射两个单独的字典
【发布时间】: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


【解决方案1】:

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

df.loc[(df['work'] == 1) & df['hour'].isin([0, 1, 2, 3, 4, 5, 6]),['hindex']] = 1
df.loc[(df['work'] == 1) & df['hour'].isin([7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), ['hindex']] = 2
df.loc[(df['work'] == 1) & df['hour'].isin([17, 18, 19, 20, 21, 22, 23]), ['hindex']] = 3

df.loc[(df['work'] == 0) & df['hour'].isin([0, 1, 2, 3, 4, 5, 6]), ['hindex']] = 1
df.loc[(df['work'] == 0) & df['hour'].isin([7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), ['hindex']] = 2
df.loc[(df['work'] == 0) & df['hour'].isin([17, 18, 19, 20, 21, 22, 23]), ['hindex']] = 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2017-05-17
    • 2019-08-23
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多