这个教程提到了pandas中的groupby对象是惰性的。
它的本质是懒惰的。在你明确要求之前,它并不会执行任何操作来产生有用的结果。
而且,值得一提的是,.groupby()确实会做一些分割工作,但不是全部,只是为你传递的每个键构建一个Grouping类实例。然而,这些分组所持有的BaseGrouper类的许多方法都是在init()时被调用的,而且许多方法也使用缓存属性设计。
因此,我进行了一些测试来确保groupby确实是惰性的。
让我们
几乎不需要花费时间,而且...
它的本质是懒惰的。在你明确要求之前,它并不会执行任何操作来产生有用的结果。
而且,值得一提的是,.groupby()确实会做一些分割工作,但不是全部,只是为你传递的每个键构建一个Grouping类实例。然而,这些分组所持有的BaseGrouper类的许多方法都是在init()时被调用的,而且许多方法也使用缓存属性设计。
因此,我进行了一些测试来确保groupby确实是惰性的。
让我们
df=pd.DataFrame(np.random.randint(1,10,size=(1000000,4)))
那么
%timeit gg=df.groupby(1)
35.6 µs ± 110 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
几乎不需要花费时间,而且...
%timeit res=gg.get_group(1)
2.76 ms ± 8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
计时更长,仅比稍快
%timeit res=df[df[1]==1]
6.87 ms ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
另一方面,如果我们首先提取组
%timeit gdict=df.groupby(1).groups
15.7 ms ± 35.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
获取群组不需要任何时间
%timeit gdict[1]
29.8 ns ± 0.0989 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
所以我的问题是
- 为什么Pandas将
groupby
设计成懒惰的呢?在实际应用中,我认为几乎总是需要对组对象进行许多进一步的操作。如果组对象在第一次拆分数据帧时就是懒惰的,那么每次执行像get_group
等操作时都会浪费时间。 - 我也不理解“
.groupby()
确实做了一些拆分工作,但并非全部,通过为您传递的每个键构建一个Grouping类实例来实现”,这是什么意思? - 有可能使
groupby
对象不懒惰吗?