我对使用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)
根据一些实验,如果有多个列(通常是这种情况),则iat和之间的速度差异似乎会大大缩小。values
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\nRun Code Online (Sandbox Code Playgroud)\n\n同样有趣的是,无论您是直接访问单元格,还是先选择列,然后选择行,这都可能很重要。
\n\n在 的情况下iat,最好在完整的数据帧上使用它:
%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\nRun Code Online (Sandbox Code Playgroud)\n\n但在 的情况下values,最好选择列,然后使用values:
%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\nRun Code Online (Sandbox Code Playgroud)\n\n但无论如何,使用values代替似乎在最坏的情况下提供了相当的速度,因此如果您使用基于位置的索引(除非您更喜欢这种语法),iat则似乎没有什么增加的价值iat。values
相反,基于标签的索引不可能与 结合使用values,并且在这种情况下将比与 结合at使用快得多。locvalues
(以上时间使用 pandas 版本 0.18.0)
\n| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |