Python 基于中另一列中相似值的分组创建新列

Python 基于中另一列中相似值的分组创建新列,python,pandas,datetime,dataframe,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

嗨,我有一个带有日期时间、事件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,但我不知道如何做其余的事情。任何提示都将不胜感激

您可以使用
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
到目前为止,我们已经得到了我们想要的,但是我们需要为每个
传感器id
重置
值,这样另一个
groupby
调用就可以了

df['group'] = df.groupby('sensor_id').group.apply(lambda x: x - x.min() + 1)

df

  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

您可以使用
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
到目前为止,我们已经得到了我们想要的,但是我们需要为每个
传感器id
重置
值,这样另一个
groupby
调用就可以了

df['group'] = df.groupby('sensor_id').group.apply(lambda x: x - x.min() + 1)

df

  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

我认为您需要使用双groupby(希望传感器id已排序,如果没有,我们需要先对它们进行排序),即

输出:

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 传感器\u id事件\u id时间新 0A e1 2017-02-1405:30:00 1 1A e2 2017-02-1405:45:00 1 2 A e3 2017-02-14 08:30:00 2 3B e3 2017-02-1405: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-1405:30:00 1 7 C e3 2017-02-14 07:30:00 2 8 C e7 2017-02-14 09:35:00 3
我认为您需要使用双groupby(希望传感器id已排序,如果没有,我们需要先对它们进行排序),即

输出:

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 传感器\u id事件\u id时间新 0A e1 2017-02-1405:30:00 1 1A e2 2017-02-1405:45:00 1 2 A e3 2017-02-14 08:30:00 2 3B e3 2017-02-1405: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-1405:30:00 1 7 C e3 2017-02-14 07:30:00 2 8 C e7 2017-02-14 09:35:00 3
这难道不会忽略传感器ID吗?我需要每个传感器id。因为你删除了帖子,我很快就找到了解决方案。但你们回来了,是的,我认为ngroup就足够了,但它不会为每个组重置,所以必须使用嵌套组。但这不会忽略传感器ID吗?我需要每个传感器id。因为你删除了帖子,我很快就找到了解决方案。但你回来了是的,我认为ngroup就足够了,但它不会为每个组重置,所以必须使用嵌套组。嗨,谢谢,这似乎是可行的。。为什么您认为有必要对传感器id进行分类?groupby不会这样做吗?这是因为我在最后得到了.value,所以赋值不是基于排序的。但是,我对你的解决方案进行了改进,因为某些原因,它无法在更大的数据集上工作,所以我选择了coldspeedMaybe的解决方案,因为
x['time'].dt.hour
使用
pd.TimeGrouper(freq='1H')尝试相同的解决方案
内部应用。希望对你有帮助,史,谢谢,这似乎是可行的。。为什么您认为有必要对传感器id进行分类?groupby不会这样做吗?这是因为我在最后得到了.value,所以赋值不是基于排序的。但是,我对你的解决方案进行了改进,因为某些原因,它无法在更大的数据集上工作,所以我选择了coldspeedMaybe的解决方案,因为
x['time'].dt.hour
使用
pd.TimeGrouper(freq='1H')尝试相同的解决方案
内部应用。希望能有帮助