Pandas diff SeriesGroupBy 比较慢

2023-12-31

Total time: 1.01876 s
Function: prepare at line 91

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    91                                           @profile
    92                                           def prepare():
    93                                           
    94         1       5681.0   5681.0      0.6     
    95         1       2416.0   2416.0      0.2      
    96                                           
    97                                               
    98         1        536.0    536.0      0.1      tss = df.groupby('user_id').timestamp
    99         1     949643.0 949643.0     93.2      delta = tss.diff()
   100         1       1822.0   1822.0      0.2      
   101         1      13030.0  13030.0      1.3      
   102         1       5193.0   5193.0      0.5      
   103         1       1251.0   1251.0      0.1      
   104                                           
   105         1       2038.0   2038.0      0.2      
   106                                           
   107         1       1851.0   1851.0      0.2     
   108                                           
   109         1        282.0    282.0      0.0      
   110                                           
   111         1       3088.0   3088.0      0.3      
   112         1       2943.0   2943.0      0.3      
   113         1        438.0    438.0      0.0      
   114         1       4658.0   4658.0      0.5      
   115         1      17083.0  17083.0      1.7      
   116         1       3115.0   3115.0      0.3      
   117         1       3691.0   3691.0      0.4      
   118                                           
   119         1          2.0      2.0      0.0      

我有一个数据框,我按某个键进行分组,然后从每个组中选择一列,并对该列(每组)执行 diff。如分析结果所示,与其他操作相比,diff 操作非常慢,并且是一种瓶颈。这是预期的吗?是否有更快的替代方案可以达到相同的结果?

编辑:更多解释在我的用例中,时间戳代表用户某些操作的时间,我想计算这些操作之间的增量(它们已排序),但每个用户的操作完全独立于其他用户。

编辑:示例代码

import pandas as pd
import numpy as np


df = pd.DataFrame(
    {'ts':[1,2,3,4,60,61,62,63,64,150,155,156,
           1,2,3,4,60,61,62,63,64,150,155,163,
           1,2,3,4,60,61,62,63,64,150,155,183],
    'id': [1,2,3,4,60,61,62,63,64,150,155,156,
           71,72,73,74,80,81,82,83,64,160,165,166,
           21,22,23,24,90,91,92,93,94,180,185,186],
    'other':['x','x','x','','x','x','','x','x','','x','',
             'y','y','y','','y','y','','y','y','','y','',
             'z','z','z','','z','z','','z','z','','z',''],
    'user':['x','x','x','x','x','x','x','x','z','x','x','y',
            'y','y','y','y','y','y','y','y','x','y','y','x',
            'z','z','z','z','z','z','z','z','y','z','z','z']
    })



df.set_index('id',inplace=True)
deltas=df.groupby('user').ts.transform(pd.Series.diff)

如果您不想对数据进行排序或下拉至numpy,那么通过改变你的user系列到分类。分类数据有效地存储为整数指针。

在下面的示例中,我看到从 86 毫秒改进到 59 毫秒。对于更大的数据集和更多用户重复的情况,这可能会进一步改进。

df = pd.concat([df]*10000)

%timeit df.groupby('user').ts.transform(pd.Series.diff)  # 86.1 ms per loop

%timeit df['user'].astype('category')                    # 23.4 ms per loop
df['user'] = df['user'].astype('category')
%timeit df.groupby('user').ts.transform(pd.Series.diff)  # 35.7 ms per loop

如果您正在执行多项操作,则转换为分类的一次性成本可以打折。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas diff SeriesGroupBy 比较慢 的相关文章

随机推荐

  • 代码高尔夫:井字棋

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 按字符数发布您的最短代码 以检查玩家是否获胜 如果获胜 是哪一个 假设变量中有一个整数数组b
  • 重命名 ASP.NET Identity 表时出现重复的外键

    我遵循了以下建议这个问题 https stackoverflow com questions 19460386 how can i change the table names when using visual studio 2013 a
  • 参数包扩展的“模式”定义,尤其是在函数调用中

    据我了解 当包含参数包的模式右侧出现省略号 时 该模式将为包中的每个参数扩展一次 然而 尽管我能够找到模式及其扩展的孤立示例 但我无法找到模式构成的定义 据我所知 空格在模式的定义中不起任何作用 但括号却起作用 例如 在这个例子中 temp
  • 在 sbt 控制台上运行 Spark

    我是 Spark 新手 正在尝试在 sbt 控制台上运行它 我有一个合适的build sbt 因为代码在 Intellij 上运行良好 并且能够导入代码中的包 问题是 当在 sbt 控制台 终端 上运行时 执行器只是保持运行并且无法完成任务
  • android 阿拉伯语十进制格式,符号位于数字右侧

    我正在尝试支持左语言的 RTL 并且正在使用阿拉伯语进行测试 我对此一无所知 负号 正号应该位于数字的右侧还是左侧 我认为它应该在左侧 但是当我使用 Android 的 DecimalFormat 将数字放入设备设置的区域设置时 该符号出现
  • 候选者的 UITableView 类型不匹配?

    Xcode 说 候选者的 UITableView 类型不匹配 有人知道如何解决这个问题吗 func tableView tableView UITableView numberOfRowsInSection section Int gt I
  • C++ 11 代码可以使用 `clang++` 进行编译,但不能使用 `clang -x c++` 进行编译

    基本问题 我有以下代码 include
  • Android SQLite删除行问题

    我正在尝试从表中删除一行 但我有三个 WHERE 子句 并且不确定我是否使用了正确的语句 db delete DBAdapter TableName Id Id AND WHERE QstnrId Integer parseInt Ques
  • 使用 github 操作创建拉取请求

    我试图让它发挥作用 但我也很困惑 在触发彼得埃文斯公关之前 它之间缺少什么 这个场景非常简单 我喜欢在任何 feature 分支上推送 自动创建 PR 但相反 我遇到了奇怪的场景 其中开发更改应用于 feature 分支之上 有人可以给我提
  • 为什么使用 webflux 进行 Spring Boot 测试会忽略自定义 Jackson 模块

    我正在使用 Spring Boot 2 0 1 和 WebFlux 路由器功能编写一个应用程序 not基于注释 对于我的一些数据对象 我编写了扩展的自定义序列化器StdSerializer 这些我注册在SimpleModule并将该模块公开
  • 隐藏溢出时检测用户滚动尝试

    scroll 当内容为overflow hidden wheel 滚轮鼠标会触发 但鼠标不会触发魔术触控板 http www apple com shop product MC380LL A magic trackpad or 魔术鼠标 h
  • SQL - 检查列是否自动递增

    我正在尝试运行查询来检查列是否自动递增 我可以检查类型 默认值 是否可为空等 但我不知道如何测试它是否自动递增 这是我测试其他事情的方法 SELECT FROM INFORMATION SCHEMA COLUMNS WHERE TABLE
  • InfluxDB - 仅获取查询中的最后一个值

    是否可以只查询查询结果的最后一个值 或第n个值 例如 在查询中 SELECT value FROM response times WHERE time gt now 1h limit 1000 是否有可能只获取最后一个值 即时间上更早的值
  • Django 管理表单 - 如何动态更改选择选项?

    我有 2 个型号 class City models Model name models CharField max length 50 slug models SlugField max length 50 class CityNews
  • 批处理文件中括号内的转义括号

    这就是我正在尝试做的 echo This is some code that is echo Important to echo exactly as is echo Even if I use parenthesis echo for s
  • CesiumViewer 中的响应式 DIV [CesiumJS]

    我正在定制一个 Cesium 地图 它有一个覆盖层 里面有各种信息 我用 bootsrap 实现的覆盖层的样式 不幸的是我放置的 div 保留在特定位置并忽略页面大小的调整 有没有办法让添加到铯查看器的 DIV 响应 我现在做的是 var
  • 为什么我的代码没有在我的应用程序上更新? (更新eclipse后)

    在你因为看不到任何代码而否决我的问题 否决的荒谬理由 之前 请阅读它 问题 问题是 即使我更改代码并在手机上运行它 它也会运行 但应用程序实际上不会改变 例如 如果我以前吃吐司会说 hello world 在 onCreate 中 但后来我
  • 什么是 Webhook?我为什么要关心?

    我能找到的最好的是这个维基条目 http en wikipedia org wiki Webhook 我想 肯定还有比这更多的事情 我错过了什么吗 来自doc https webhooks pbworks com w page 133851
  • 如何获得所有可能的 3 个字母排列? [复制]

    这个问题在这里已经有答案了 可能的重复 列出字符串 整数的所有排列 https stackoverflow com questions 756055 listing all permutations of a string integer
  • Pandas diff SeriesGroupBy 比较慢

    Total time 1 01876 s Function prepare at line 91 Line Hits Time Per Hit Time Line Contents 91 profile 92 def prepare 93