基于pandas中另一列中的类似值的分组创建新列

时间:2017-11-05 14:05:27

标签: python pandas datetime dataframe

您好我有一个事件数据框,其中包含日期时间和事件ID以及传感器ID。我想将每个传感器在一小时内发生的事件分组,如果可能的话,用组计数标记它们。 原始数据框

         sensor_id  event_id   time  
    0    A         e1            2017-02-14 05:30:00      
    1    A         e2            2017-02-14 05:45:00 
    2    A         e3            2017-02-14 08:30:00 
    3    B         e3            2017-02-14 05:20:00 
    4    B         e4            2017-02-14 05:30:00 
    5    B         e6            2017-02-14 05:45:00 
    6    C         e1            2017-02-14 05:30:00 
    7    C         e3            2017-02-14 07:30:00 
    8    C         e7            2017-02-14 09:35:00 

期望的结果:

         sensor_id  event_id      time                  group 
    0    A         e1            2017-02-14 05:30:00      1
    1    A         e2            2017-02-14 05:45:00      1
    2    A         e3            2017-02-14 08:30:00      2
    3    B         e3            2017-02-14 05:20:00      1
    4    B         e4            2017-02-14 05:30:00      1
    5    B         e6            2017-02-14 05:45:00      1
    6    C         e1            2017-02-14 05:30:00      1
    7    C         e3            2017-02-14 07:30:00      2
    8    C         e7            2017-02-14 09:35:00      3

我明白我应该按用户分组,事件然后,时间使用1小时的timdelta,但我不知道如何做其余的事情。任何提示将不胜感激。

2 个答案:

答案 0 :(得分:3)

我认为你需要选择双组(希望sensor_id如果不是我们需要先排序),即

df['new'] = df.groupby('sensor_id').apply( lambda x : x.groupby(x['time'].dt.hour).ngroup()+1).values

输出:

  sensor_id event_id                time  new
0         A       e1 2017-02-14 05:30:00    1
1         A       e2 2017-02-14 05:45:00    1
2         A       e3 2017-02-14 08:30:00    2
3         B       e3 2017-02-14 05:20:00    1
4         B       e4 2017-02-14 05:30:00    1
5         B       e6 2017-02-14 05:45:00    1
6         C       e1 2017-02-14 05:30:00    1
7         C       e3 2017-02-14 07:30:00    2
8         C       e7 2017-02-14 09:35:00    3

答案 1 :(得分:2)

您可以使用pd.TimeGrouper + ngroup按时间频率进行分组。

df['time'] = pd.to_datetime(df.time)
df['group'] = df.set_index('time').groupby(['sensor_id', 
                    pd.TimeGrouper(freq='1H')], sort=False).ngroup().values

到目前为止,我们已经拥有了我们想要的内容,但我们需要重置每个group的{​​{1}}值,以便进行另一次sensor_id调用。

groupby