【发布时间】:2016-09-17 02:32:48
【问题描述】:
我比较了访问DataFrame 中数据的几种方法。请参阅下面的结果。最快的访问是在DataFrame 上使用get_value 方法。我在post 上被提及。
令我惊讶的是,通过get_value 访问比通过底层numpy 对象df.values 访问更快。
问题
我的问题是,有没有办法像通过 get_value 访问 pandas 数据框一样快地访问 numpy 数组的元素?
设置
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(16).reshape(4, 4))
测试
%%timeit
df.iloc[2, 2]
10000 次循环,3 次中的最佳:每个循环 108 µs
%%timeit
df.values[2, 2]
最慢的运行时间是最快的运行时间的 5.42 倍。这可能意味着正在缓存中间结果。 100000 次循环,3 次中的最佳:每个循环 8.02 µs
%%timeit
df.iat[2, 2]
最慢的运行时间是最快的运行时间的 4.96 倍。这可能意味着正在缓存中间结果。 100000 次循环,最佳 3 次:每个循环 9.85 µs
%%timeit
df.get_value(2, 2)
最慢的运行时间是最快的运行时间的 19.29 倍。这可能意味着正在缓存中间结果。 100000 次循环,最佳 3 次:每个循环 3.57 µs
【问题讨论】:
-
对于曾经否决过这个问题的人,我希望能得到一些关于原因的反馈。谢谢
-
如果你的瓶颈是单元素访问,那么你应该一次访问多个元素
-
另外,您可能想检查
x = df.values; %timeit x[2,2]是否给出了类似的结果——也许values不是属性而是property?