gpt4 book ai didi

python - Pandas :实现组操作的 'built-in' 方法(例如均值、标准值)的速度

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:37 26 4
gpt4 key购买 nike

我正在使用相对较大的 DataFrame(~4M 行 x 11 列,数字 ctypes)。

我需要进行基于groupby 的操作,尤其是transformaggregate。我大约与 O(1M) 组一起工作。

在我的机器上(i7 2600k,8GB 内存,Fedora20x64),我注意到除了“内置”操作之外,几乎不可能运行任何 groupby 操作。

例如

  df.groupby('key').Acol.mean()

只需要几分之一秒,而

  df.groupby('key').Acol.aggregate(pd.Series.mean)

可能需要几分钟,内存消耗会激增。

通过 lambda 指定的任何其他操作,即使是根据 pd.Series 向量化编写的,所花费的时间远远超过我可以等待的时间,或者达到疯狂交换水平。

问:您有什么建议可以更接近“内置”方法的性能吗?

我能否以某种方式编写我的方法,就像编写内置函数一样? cython 有帮助吗?


当从aggregate 传递到transform 时,情况不知何故变得更糟。

因此我找不到“内置”函数(我是否遗漏了什么??)

我正在做什么来解决这个问题:

我将 df 分成几部分(以数据安全的方式),将它们存储在 hdf5 文件中,从 4 个客户端加载它们,并行操作数据,重新保存在'hdf5'中,最后将结果合并到最终的df中。该解决方案要么有效,要么产生客户端的极端交换。

最佳答案

这使用常量内存,并且是 O(组数)。

内置函数具有巨大的加速,原因有两个。

  • 他们没有构建一个很好的对象来计算内置值,因为不需要索引
  • 他们不必从 cython 空间转到 python 空间(并返回)。

因此,在非平凡的计算中,您必须使用内置函数。使用 (apply/aggregate) 非常适合广义函数评估,但 pandas 不能对用户函数中发生的事情做出太多假设,而这些是在 python 空间中评估的。

In [28]: df = DataFrame(np.random.randn(4000000,11))

In [29]: df.groupby(df.index//4).ngroups
Out[29]: 1000000

In [30]: %timeit df.groupby(df.index//4).mean()
1 loops, best of 3: 412 ms per loop

In [31]: %timeit -n 1 df.groupby(df.index//4).apply(lambda x: x.mean())
1 loops, best of 3: 1min 22s per loop

传递 .aggregates(pd.Series.mean) 实际上是 .apply(lambda x: x.mean()) 并招致相同的性能损失。

您应该始终尽可能使用矢量化内置函数,尤其是在有大量组的情况下。

这是一个没有内置但可以轻松实现的示例:

我想计算最大-最小值,所以天真地你应该这样做:

df.groupby(...).apply(lambda x: x.max()-x.min())

做起来更快:

g = df.groupby(...)
g.max()-g.min()

关于python - Pandas :实现组操作的 'built-in' 方法(例如均值、标准值)的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com