【发布时间】:2020-04-05 11:18:54
【问题描述】:
本教程中提到 pandas 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 对象不懒惰?
【问题讨论】: