Python 基于中另一列中相似值的分组创建新列
嗨,我有一个带有日期时间、事件ID和传感器ID的事件数据框。我想对每个传感器一小时内发生的事件进行分组,如果可能的话,用组计数标记它们。 原始数据帧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
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')尝试相同的解决方案
内部应用。希望能有帮助