首页 > 解决方案 > 如何计算特定时间段内的频率

问题描述

我有一个数据框:

df = pd.DataFrame({
'ID': [1, 2, 1, 2, 1, 2, 3, 4, 4, 1, 2, 1, 2, 3, 4, 4, 2, 1, 3],
'TIME': ['2010-01-01 01:01:00', '2010-01-01 01:05:00' , '2010-01-01 01:24:00', '2010-01-01 01:27:00', '2010-01-01 01:33:00', '2010-01-01 01:34:00', '2010-01-01 01:35:00', '2010-01-01 01:37:00', '2010-01-01 01:38:00', '2010-01-13 05:52:00', '2010-01-13 05:53:00', '2010-01-13 05:54:00', '2010-01-13 05:58:00', '2010-01-13 06:04:00', '2010-01-13 06:14:00', '2010-01-13 06:25:00', '2010-01-13 06:24:00', '2010-01-13 06:26:00', '2010-01-13 06:27:00']
})

我想找出在 2 小时内出现超过 3 次的所有 ID,以及在 2 小时内出现的最高频率。
我的代码是:

df_4 = pd.DataFrame(columns=['ID', 'COUNTS'])
for time in pd.unique(df['TIME']):
   time = pd.to_datetime(time)
   df_2 = df.loc[(df['TIME']>=time) & (df['TIME']<= (time + timedelta(hours=2)))]
   df_3 = df_2.ID.value_counts().rename_axis('ID').reset_index(name='COUNTS')
   df_3 = df_3.loc[df_3['COUNTS']>=3]
   df_4 = df_4.append(df_3, ignore_index=True)
df_5 = df_4.groupby('ID').max().COUNTS

但循环时间太长。有人可以帮我更快地完成吗?谢谢你。

标签: pythonloopsoptimization

解决方案


你可能想试试这个。

df_4 = df.assign(dummy=1).pivot_table('dummy','TIME','ID',aggfunc=sum).sort_index(ascending=False)
df_4 = df_4.rolling('2h').sum().reset_index().melt('TIME', value_name='COUNTS')
df_4 = df_4.loc[df_4['COUNTS'] >= 3, ['ID', 'COUNTS']]

df_5 = df_4.groupby('ID').max().COUNTS

在此处输入图像描述

我的代码背后的主要逻辑是使用 pandas.rolling('2h')函数。但是,在使用 rolling 之前我需要做一些处理.rolling()

首先,我必须先旋转您的表格,然后TIME按降序将列设置为索引。

为了旋转你的表,我必须添加一个虚拟变量(因为.pivot_table()如果我不这样做会返回一个错误。注意:我使用的虚拟变量是1和 1 = 计数的总和。

现在表格被旋转并TIME设置为索引,我应用了该rolling()函数。

之后,我使用 取消透视表.melt(),过滤表,最后应用您的groupby()函数。


推荐阅读