【发布时间】:2016-11-06 00:45:23
【问题描述】:
我想通过计算 begin 和 end 之间的值的数量 N 来“合并”numpy.array 或 pandas.Series x。结果存储在pandas.DataFrame:
import numpy as np
import pandas as pd
bins = pd.DataFrame({'from': np.arange(0, 1, 0.01), 'to': np.arange(0, 1, 0.01) + 0.1})
x = np.random.rand(1000000)
bins['N'] = bins.apply(lambda r: ((x >= r['from']) & (x < r['to'])).sum(), axis=1)
当我分析代码时,整个脚本中最慢的部分(包含更多内容)如果最后一行,尤其是 lambda:15 % 的时间花在那个 lambda 上!
我感觉我必须以矢量化方式实现,而不是使用lambda,但我不知道如何。
我正在使用 Python 3.5、numpy 1.11 和 pandas 0.18.1
编辑:附加信息 + 使用间隔树进行测试
实际上,这种分箱是迭代使用的:分箱是用一些数据启动的,并且可能会用其他数据集进行更新。
正如建议的那样,我尝试过使用 intervaltree,但它的性能甚至变得最差。从第二次迭代开始,我收到了用户警告,因为 boold dtype 上的 numexpr 不支持“+”,所以它切换到纯 python 模式。
【问题讨论】:
-
这是一个真实的例子吗?我问的原因是通常你可以只比较整个 df 但你的长度不匹配所以在这种情况下你不能这样做
-
谢谢@EdChum。现实世界是这样的。事实上,我在 x 中有数百万个数据,我想将它们压缩到 1000 个 bin 中。因此,长度不匹配的事实确实是意料之中的 - 这就是压缩(近似)的结果
-
那么你可以使用某种直方图之类的方法或
pd.cut吗? -
你能检查root对这个问题的回答吗? stackoverflow.com/a/37287621/2285236
-
谢谢@ayhan。我还没有看到那个帖子......但是间隔树变得最糟糕;我已经相应地更新了问题。
标签: python numpy pandas optimization lambda