为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在多列上加快 groupby 速度,然后用 1 个句点进行 diff 吗?

我可以在多列上加快 groupby 速度,然后用 1 个句点进行 diff 吗?

梦里花落0921 2022-06-28 16:15:02
我有一个像这样的DataFrame。df = pd.DataFrame({'a': np.random.randint(0, 3, 10**7),                     'b': np.random.randint(0, 4000, 10**7),                     'c': np.random.random(10**7)}我想按前两列分组(无序,与我在此处提供的组数大致相同),然后区分第三列。df.groupby(['a', 'b']).c.diff(periods=-1)可悲的是,这对我来说很慢,但我想这是相当多的工作。>>> %timeit df.groupby(['a', 'b']).c.diff(periods=-1)     10.2 s ± 75.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)有什么办法可以避免 Pandas groupby 加快速度吗?我知道在 Pandas 中进行 groupby->reduce 时,通常可以用纯 NumPy 替换,但我不确定这里是否有什么聪明的方法可以代替 groupby 操作。
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这确实是一个有趣的问题,因为我们通常只选择groupby(),即使它相当昂贵。

这是另一种更快的方法:

  1. 排序方式['a','b']

  2. 计算差异,屏蔽每个块中的最后一行NaN

和代码:

s = df.sort_values(['a', 'b'])df['diff_c'] = (s['c'].diff(periods=-1)
                       .where(s.duplicated(['a','b'], keep='last'))
                )

在我的计算机上,您的代码在 8.5 秒内运行,而上述代码在 1.8 秒内运行。


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信