python - 如何计算特定时间段内的频率
问题描述
我有一个数据框:
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
但循环时间太长。有人可以帮我更快地完成吗?谢谢你。
解决方案
你可能想试试这个。
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()
函数。
推荐阅读
- python - Power BI 和 Pycaret.clustering Python 库
- flutter - GetX 颤振状态未更新
- reactjs - 用于内部身份验证令牌发行的 OAuth 代码授权流程
- javascript - prisma generate:无法解析依赖树(Prisma + Postgresql + NextJS)
- java - 在 JavaFX 中绘制形状
- powershell - PowerShell 脚本中的 Azure DevOps REST API 顶部参数不起作用
- flutter - 我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类
- android - 在颤振中构建 appbundle 时出现错误
- c# - 实体框架:如何基于现有属性添加关联
- python - 在python中实现rot13