【发布时间】:2015-05-08 15:54:41
【问题描述】:
我试图弄清楚何时在 pandas DataFrame 中使用不同的选择方法。特别是,我正在寻找访问标量值。我经常听到ix 被普遍推荐。但是在pandas documentation
建议使用at 和iat 进行快速标量值访问:
Since indexing with [] must handle a lot of cases (single-label access, slicing, boolean indexing, etc.), it has a bit of overhead in order to figure out what you’re asking for. If you only want to access a scalar value, the fastest way is to use theatand iat methods, which are implemented on all of the data structures.
所以,我认为iat 应该更快地获取和设置单个单元格。然而,经过一些测试,我们发现ix 读取单元格的速度相当或更快,而iat 为单元格赋值要快得多。
这种行为是否记录在任何地方?总是如此,为什么会发生这种情况?它是否必须与返回视图或副本有关?如果有人能对这个问题有所了解并解释获取和设置单元格值的建议以及原因,我将不胜感激。
这里有一些使用 pandas(版本 0.15.2)的测试。
为了确保这种行为不是这个版本的错误,我也在 0.11.0 上进行了测试。我不提供结果,但趋势完全一样 - ix being much faster for getting, and iat for setting individual cells。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(1000,2),columns = ['A','B'])
idx = 0
timeit for i in range(1000): df.ix[i,'A'] = 1
timeit for i in range(1000): df.iat[i,idx] = 2
>> 10 loops, best of 3: 92.6 ms per loop
>> 10 loops, best of 3: 21.7 ms per loop
timeit for i in range(1000): tmp = df.ix[i,'A']
timeit for i in range(1000): tmp = df.iat[i,idx]
>> 100 loops, best of 3: 5.31 ms per loop
>> 10 loops, best of 3: 19.4 ms per loop
【问题讨论】:
-
我认为 get_value() 和 set_value() 更快
-
有趣的是要注意相对差异。使用 pandas 0.14.1,我分别得到以下结果:1) 10 个循环,最好的 3:每个循环 108 ms 2) 100 个循环,最好的 3:每个循环 12.1 ms 3) 100 个循环,最好的 3:5.55每个循环的毫秒数 4) 100 个循环,最好的 3 个:每个循环 9.43 毫秒
-
看起来 iat for getting 在最近的版本中得到了显着改善。对于 pandas 0.19.1,我仍然看到 ix 在最后 2 次计时中比 iat 快,但只是勉强。以上结果是 5.31 vs 19.4 (in version 0.15.2) ,但我看到的是 6.01 vs 7.16 (in version 0.19.1)。