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

标签 python pandas performance numpy

我有一个像这样的数据框。

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 操作。

最佳答案

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

这是另一种更快的方法:

  1. ['a','b']排序
  2. 计算差异,用 NaN 屏蔽每个 block 中的最后一行

和代码:

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 秒。

关于python - 我可以加快多列上的 groupby 速度,然后使用 1 个句点进行 diff 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453960/

相关文章:

python - 属性错误: 'tuple' object has no attribute 'replace' For brackets

python - Pandas 应用 - 返回多行

performance - 我的 Prestashop 很慢 - 我怎样才能让它更快?

python - PyGTK-2.24.0安装找不到NumPy

python - 如何设置列表框中项目的颜色

Python Pandas : Groupby date, 并按时间戳访问每个组

javascript - 提高使用解构和递归处理数组的函数的性能

iphone - 为什么 PhoneGap 看起来比 Titanium 快?

python - 不遵守最小、最大限制的垂直线(matplotlib)

python - 根据与行值的比较在 DataFrame 中创建新列