我在这里看到的一个区别是,您(有效)使用 dtype=int64 初始化了 df2 和 df4,但使用 dtype=object 初始化了 df 和 df3。对于 df2 和 df4,您可以使用空实值进行初始化:
#df has multiindex
df = pd.DataFrame(np.empty([ncols,nlines]),
columns = columns, index = lines)
#df3 is mono-index and not initialized
df3 = pd.DataFrame(np.empty([ncols,nlines]),
columns = np.arange(ncols), index = np.arange(nlines))
您还可以添加dtype=int
初始化为整数而不是实数,但这似乎与速度无关。
我得到的时间比你对 df4 的时间快得多(代码没有区别),所以这对我来说是个谜。无论如何,通过上述对 df 和 df3 的更改,df2 到 df4 的时间很接近,但不幸的是 df 仍然很慢。
%timeit df.loc[(0, 0, 0), (0, 0)] = 2*np.arange(ncols)
1 loop, best of 3: 418 ms per loop
%timeit df2.loc[:,0] = 2*np.arange(ncols)
10000 loops, best of 3: 185 µs per loop
%timeit df3.loc[0] = 2*np.arange(ncols)
10000 loops, best of 3: 116 µs per loop
%timeit df4.loc[:,0] = 2*np.arange(ncols)
10000 loops, best of 3: 196 µs per loop
编辑添加:
至于多索引的更大问题,我不知道,但有两个想法:
1)扩展@ptrj的评论,我很快就得到了他的建议(与简单索引方法大致相同):
%timeit df.loc[(0, 0, 0) ] = 2*np.arange(ncols)
10000 loops, best of 3: 133 µs per loop
所以我再次得到了与你截然不同的时间(?)。 FWIW,当您想要整行带有 loc/iloc 时,建议使用:
而不是将列引用留空:
timeit df.loc[(0, 0, 0), : ] = 2*np.arange(ncols)
1000 loops, best of 3: 223 µs per loop
但正如你所看到的,它有点慢,所以我不知道这里建议哪种方式。我想您通常应该按照文档的建议进行操作,但另一方面,这对您来说可能是速度上的重要差异。
2)或者,这相当暴力,但您可以保存索引/列,将索引/列重置为简单,然后将索引/列设置回多。虽然,这与仅仅采取没有什么不同df.values
我怀疑对你来说不太方便。