为什么不使用.values而不是.iat来提高6倍的性能?

jer*_*ich 10 python pandas

我对使用my_series.values[0]而不是使用系列元素获得的6倍性能提升感到惊讶my_series.iat[0].

根据文档,.iat是快速访问标量的推荐方法.我是否因使用而遗漏了什么.values

import numpy as np
import pandas as pd

n = 1000
dct = {'A': np.random.rand(n)}
df = pd.DataFrame(dct)
s = df['A']
vals = s.values

%timeit -n 10000 val = s.iloc[0]
%timeit -n 10000 val = s.iat[0]
%timeit -n 10000 val = s.values[0]
%timeit -n 10000 vals[0]

**Output**
10000 loops, best of 3: 24.3 µs per loop
10000 loops, best of 3: 13.4 µs per loop
10000 loops, best of 3: 2.06 µs per loop
10000 loops, best of 3: 337 ns per loop
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnE 3

根据一些实验,如果有多个列(通常是这种情况),则iat和之间的速度差异似乎会大大缩小。values

\n\n
n = 1000\ndct = {'A': np.random.rand(n), 'B': np.random.rand(n) }\ndf = pd.DataFrame(dct)\n\n%timeit df.iat[n-5,1]\n100000 loops, best of 3: 9.72 \xc2\xb5s per loop\n\n%timeit df.B.values[n-5]\n100000 loops, best of 3: 7.3 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

同样有趣的是,无论您是直接访问单元格,还是先选择列,然后选择行,这都可能很重要。

\n\n

在 的情况下iat,最好在完整的数据帧上使用它:

\n\n
%timeit df.iat[n-5,1]\n100000 loops, best of 3: 9.72 \xc2\xb5s per loop\n\n%timeit df.B.iat[n-5]\n100000 loops, best of 3: 15.4 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

但在 的情况下values,最好选择列,然后使用values

\n\n
%timeit df.values[n-5,1]\n100000 loops, best of 3: 9.42 \xc2\xb5s per loop\n\n%timeit df.B.values[n-5]\n100000 loops, best of 3: 7.3 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

但无论如何,使用values代替似乎在最坏的情况下提供了相当的速度,因此如果您使用基于位置的索引(除非您更喜欢这种语法),iat则似乎没有什么增加的价值iatvalues

\n\n

相反,基于标签的索引不可能与 结合使用values,并且在这种情况下将比与 结合at使用快得多。locvalues

\n\n

(以上时间使用 pandas 版本 0.18.0)

\n