python - Pandas DataFrame 性能

标签 python dictionary pandas

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/

相关文章:

python - SQLAlchemy 双向关联代理

python - 图像标题未循环显示

python - 在 python 中使用字典键作为不同字典中的值

java - 我应该使用哪个 Map 类?

java - TreeMap 对于某些键不起作用

python - 具有亚秒级(例如毫秒)分辨率的 to_datetime

python - 将非唯一列表的虚拟对象创建到 Python 中的列中

python - 在 OSX 10.10 上链接 Boost Python

python - 在 Python 中获取彩色形状周围边界的坐标

python - Pandas 对单元格中的字符串进行排序