Pandas 按组计算过去 n 天内发生的事件次数

2023-11-30

我有按 id 发生的事件表。如何计算过去 n 天内每种事件类型在当前行之前发生的次数?

例如,事件列表如下:

df = pd.DataFrame([{'id': 1, 'event_day': '2016-01-01', 'event_type': 'type1'},
{'id': 1, 'event_day': '2016-01-02', 'event_type': 'type1'},
{'id': 2, 'event_day': '2016-02-01', 'event_type': 'type2'},
{'id': 2, 'event_day': '2016-02-15', 'event_type': 'type3'},
{'id': 3, 'event_day': '2016-01-06', 'event_type': 'type3'},
{'id': 3, 'event_day': '2016-03-11', 'event_type': 'type3'},])
df['event_day'] = pd.to_datetime(df['event_day'])
df = df.sort_values(['id', 'event_day'])

or:

   event_day event_type  id
0 2016-01-01      type1   1
1 2016-01-02      type1   1
2 2016-02-01      type2   2
3 2016-02-15      type3   2
4 2016-01-06      type3   3
5 2016-03-11      type3   3

by id我想数一下每次的次数event_type过去 n 天内发生在当前行之前。例如,在第 3 行 id=2 中,那么在事件历史记录中的该点之前(但不包括),id 2 的事件类型 1、2 和 3 在过去 n 天内发生了多少次?

所需的输出如下所示:

    event_day   event_type  event_type1_in_last_30days  event_type2_in_last_30days  event_type3_in_last_30days  id
0   2016-01-01  type1       0                           0                           0                           1
1   2016-01-02  type1       1                           0                           0                           1
2   2016-02-01  type2       0                           0                           0                           2
3   2016-02-15  type3       0                           1                           0                           2
4   2016-01-06  type3       0                           0                           0                           3
5   2016-03-11  type3       0                           0                           0                           3

res = ((((df['event_day'].values >= df['event_day'].values[:, None] - pd.to_timedelta('30 days')) 
        & (df['event_day'].values < df['event_day'].values[:, None]))
        & (df['id'].values == df['id'].values[:, None]))
        .dot(pd.get_dummies(df['event_type'])))
res
Out: 
array([[ 0.,  0.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

第一部分是生成矩阵,如下所示:

(df['event_day'].values >= df['event_day'].values[:, None] - pd.to_timedelta('30 days'))
Out: 
array([[ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True,  True],
       [False, False,  True,  True, False,  True],
       [ True,  True,  True,  True,  True,  True],
       [False, False, False,  True, False,  True]], dtype=bool)

它是一个 6x6 矩阵,每一行都会与其他行进行比较。它利用 NumPy 的广播进行成对比较(.values[:, None]添加另一个轴)。为了使其完整,我们需要检查该行是否比另一行出现得早:

(((df['event_day'].values >= df['event_day'].values[:, None] - pd.to_timedelta('30 days')) 
   & (df['event_day'].values < df['event_day'].values[:, None])))
Out: 
array([[False, False, False, False, False, False],
       [ True, False, False, False, False, False],
       [False,  True, False, False,  True, False],
       [False, False,  True, False, False, False],
       [ True,  True, False, False, False, False],
       [False, False, False,  True, False, False]], dtype=bool)

另一个条件是关于 id 的。使用类似的方法,您可以构造一个成对比较矩阵,显示 id 何时匹配:

(df['id'].values == df['id'].values[:, None])
Out: 
array([[ True,  True, False, False, False, False],
       [ True,  True, False, False, False, False],
       [False, False,  True,  True, False, False],
       [False, False,  True,  True, False, False],
       [False, False, False, False,  True,  True],
       [False, False, False, False,  True,  True]], dtype=bool)

它成为了:

(((df['event_day'].values >= df['event_day'].values[:, None] - pd.to_timedelta('30 days')) 
    & (df['event_day'].values < df['event_day'].values[:, None]))
    & (df['id'].values == df['id'].values[:, None]))
Out: 
array([[False, False, False, False, False, False],
       [ True, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False,  True, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False, False, False]], dtype=bool)

最后,您希望查看每种类型的信息,以便可以使用 get_dummies:

pd.get_dummies(df['event_type'])
Out: 
   type1  type2  type3
0    1.0    0.0    0.0
1    1.0    0.0    0.0
2    0.0    1.0    0.0
3    0.0    0.0    1.0
4    0.0    0.0    1.0
5    0.0    0.0    1.0

如果将结果矩阵与该矩阵相乘,它应该给出每种类型满足该条件的行数。您可以将结果数组传递给 DataFrame 构造函数并连接:

pd.concat([df, pd.DataFrame(res, columns = ['e1', 'e2', 'e3'])], axis=1)
Out: 
   event_day event_type  id   e1   e2   e3
0 2016-01-01      type1   1  0.0  0.0  0.0
1 2016-01-02      type1   1  1.0  0.0  0.0
2 2016-02-01      type2   2  0.0  0.0  0.0
3 2016-02-15      type3   2  0.0  1.0  0.0
4 2016-01-06      type3   3  0.0  0.0  0.0
5 2016-03-11      type3   3  0.0  0.0  0.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 按组计算过去 n 天内发生的事件次数 的相关文章

随机推荐

  • Facebook Graph API tagged_places 返回空数组

    我正在尝试获取用户标记地点但数组总是返回空 如果我通过图形浏览器并生成一个令牌 那么我会得到预期的结果 但使用应用程序中生成的访问令牌我会返回一个空数组 我要求用户标记地点许可 我知道由于此许可要求 我的应用程序必须接受审查 但我现在只是使
  • html5 canvas弹性碰撞方块

    我重新问这个问题是因为我在上一个问题中没有明确说明我想要什么 有谁知道如何使用矩形在 Canvas 中进行弹性碰撞或处理碰撞 或者能给我指出正确的方向吗 我创建了一个具有多个正方形的画布 并希望每个正方形在接触时发生偏转 这是我整理的一个快
  • 写入 selenium 数据时 CSV 为空

    我正在第一次体验 Selenium 并在一个著名的视频平台上做了一些教程 大多数时候它工作得相当可靠 但是 我遇到了一些问题 创建了 CSV 但未导出数据 CSV 被 触及 但它不会导出正常打印中显示的数据 谁能帮我看看这个脚本的问题出在哪
  • AngularJS 文本区域按 Enter 键换行

    我正在开发一个 AngularJS 应用程序 就像我们在 stackoverflow 上发布答案和问题一样 我们可以在文本区域下方实时预览答案或问题 这是我的试用代码 索引 html div div
  • FormData.get 函数未定义

    FormData get 在 Chrome 中未定义 https developer mozilla org en US docs Web API FormData get 默认情况下 Chrome 不支持 get 方法 以及delete
  • 使用 PDFBox 从 PDF 中读取某些 unicode 字符时出现问题

    我是 PDFBOX 新手 我正在阅读印地语的 PDF 文件 我在使用 PDFBox 从 PDF 中读取某些 unicode 字符时遇到问题 我想将字符串复制到 java 对象中 以便我可以处理它 我尝试了一些方法来读取文件 1 我尝试使用P
  • 如何在分组项目页面中每组之前插入图像列表?

    我目前正在使用 XAML 和 C 开发 Windows 8 应用程序 我开发了动态生成数据组的分组项目页面 我有一个社交媒体图标列表 我需要将其放在每个组标题旁边 但在左侧对齐 如屏幕截图所示 当我在 XAML 代码中添加列表时 它会在第一
  • Makefile c++11 支持

    我最近开始了一个 C 的小项目 我创建了一个简单的 Makefile CC g CFLAGS std c 0x I c VPATH src include vpath c src vpath h include TabooSearch ma
  • 如何在 Visual Studio 中连接到 MySQL 数据源

    我用MySQL 连接器 网络通过引用程序集 MySql Data dll 并传入连接字符串来连接到我的数据库MySqlConnection 我喜欢这样 因为我不需要安装任何东西 有没有办法在 Visual Studio 2010 中 选择数
  • 为什么我会遇到找不到类异常

    我在用DeferredTextImpl类和 eclipse 似乎没有抱怨它 但是当我运行我的项目时 我得到运行时异常 Class not found exception for DeferredTextImpl 当我搜索类文件时 我发现它在
  • 如何在 Objective C 中使用 AssetLibrary 检索视频的文件大小

    我想知道如何使用 AssetLibrary 检索视频的文件大小 有人能指出我正确的方向吗 或者可能有一些代码片段 这应该会让你走上正轨 看资产库框架参考 void logVideoSizes void assetEnumerator ALA
  • 为什么 xUnit Runner 找不到我的测试

    我有一个 xUnit net 测试如下 static class MyTestClass Fact static void MyTestMethod VS 2012 的 xUnit 插件说 没有发现可以运行的测试 TestDriven ne
  • ASP.NET MVC 中的 ELMAH 和异常管理

    我正在考虑从企业库中的异常管理应用程序块转移到新的 ASP NET MVC 站点 Scott Hansleman 在 ELMAH 上的帖子引起了我的注意 但我并不完全理解这种方法 通常 我会抑制一些异常 可恢复的异常 将它们记录在中央存储库
  • 在python中读取TDMS文件如何使用tdms info命令?

    我想知道Labview生成的tdms文件的内容是什么 按照此site 我用Python写 import numpy as np from nptdms import TdmsFile from nptdms import tdms read
  • 在外部网站上自动填写和提交表格

    我想知道一个人如何自动填写多个表格 使用bot local server 使用ajax或curl在外部站点 PHP 的多个页面上 例如一个网站www abc com index php有一个表格
  • 配置.vimrc时如何映射命令键?

    我使用 mac 我想配置 vimrc 例如 map
  • 模拟时间序列

    在最近的宏观经济预测在线课程中 有一个建模练习 y t 3 0 0 55 y t 1 e t where e t 定义为 et lt c 1 2138662 0 2854597 0 5902700 0 8285463 0 9954260 0
  • n 元函数的 Uncurry

    我有一个类型级别的数字 data Z deriving Typeable data S n deriving Typeable 和 n 元函数 来自固定向量包的代码 Type family for n ary functions type
  • 如何对 data.table 中的 .SD 列进行行明智操作

    虽然我之前已经弄清楚了这一点 但我仍然发现自己在 stackoverflow 上搜索 并且无法找到 这个语法 所以 我想对 data table 列的子集进行行明智操作 使用 SD and SDcols 我永远不记得手术是否需要sapply
  • Pandas 按组计算过去 n 天内发生的事件次数

    我有按 id 发生的事件表 如何计算过去 n 天内每种事件类型在当前行之前发生的次数 例如 事件列表如下 df pd DataFrame id 1 event day 2016 01 01 event type type1 id 1 eve