Pandas 确实很棒,但我很惊讶从 Pandas.DataFrame 中检索值的效率如此之低。在下面的玩具示例中,即使是 DataFrame.iloc 方法也比字典慢 100 倍以上。
问题:这里的教训仅仅是字典是查找值的更好方法吗?是的,我知道这正是它们的用途。但我只是想知道我是否缺少关于 DataFrame 查找性能的一些东西。
我意识到这个问题比“询问”更“沉思”,但我会接受一个能提供洞察力或观点的答案。谢谢。
import timeit
setup = '''
import numpy, pandas
df = pandas.DataFrame(numpy.zeros(shape=[10, 10]))
dictionary = df.to_dict()
'''
f = ['value = dictionary[5][5]', 'value = df.loc[5, 5]', 'value = df.iloc[5, 5]']
for func in f:
print func
print min(timeit.Timer(func, setup).repeat(3, 100000))
value = dictionary[5][5]
0.130625009537
value = df.loc[5, 5]
19.4681699276
value = df.iloc[5, 5]
17.2575249672
最佳答案
字典对 DataFrame 就像自行车对汽车一样。 您可以骑自行车 10 英尺,比启动汽车、挂档等速度更快。但如果您需要跑一英里,汽车就赢了。
对于某些小的、有针对性的目的,dict 可能更快。 如果这就是你所需要的,那么一定要使用字典!但是,如果您需要/想要 DataFrame 的功能和奢华,那么 dict 是无可替代的。如果数据结构首先不能满足你的需求,那么比较速度是没有意义的。
现在例如 -- 更具体一点 -- dict 对于访问列很有用,但对于访问行就不那么方便了。
import timeit
setup = '''
import numpy, pandas
df = pandas.DataFrame(numpy.zeros(shape=[10, 1000]))
dictionary = df.to_dict()
'''
# f = ['value = dictionary[5][5]', 'value = df.loc[5, 5]', 'value = df.iloc[5, 5]']
f = ['value = [val[5] for col,val in dictionary.items()]', 'value = df.loc[5]', 'value = df.iloc[5]']
for func in f:
print(func)
print(min(timeit.Timer(func, setup).repeat(3, 100000)))
产量
value = [val[5] for col,val in dictionary.iteritems()]
25.5416321754
value = df.loc[5]
5.68071913719
value = df.iloc[5]
4.56006002426
所以列表的字典在检索行时比 df.iloc
慢 5 倍。随着列数的增加,速度赤字变得更大。 (列数就像自行车类比中的英尺数,距离越长,车越方便……)
这只是列表字典比 DataFrame 更不方便/更慢的一个示例。
另一个例子是当你有一个 DatetimeIndex 的行并希望选择特定日期之间的所有行时。使用 DataFrame,您可以使用
df.loc['2000-1-1':'2000-3-31']
如果您要使用列表的字典,则没有简单的类比。与 DataFrame 相比,您需要用于选择正确行的 Python 循环再次变得非常慢。
关于python - Pandas DataFrame 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084338/