【发布时间】:2015-10-08 18:38:14
【问题描述】:
我想尽可能高效地绘制pandas.DataFrame 的引导样本。使用内置 iloc 和整数列表似乎很慢:
import pandas
import numpy as np
# Generate some data
n = 5000
values = np.random.uniform(size=(n, 5))
# Construct a pandas.DataFrame
columns = ['a', 'b', 'c', 'd', 'e']
df = pandas.DataFrame(values, columns=columns)
# Bootstrap
%timeit df.iloc[np.random.randint(n, size=n)]
# Out: 1000 loops, best of 3: 1.46 ms per loop
索引numpy 数组当然要快得多:
%timeit values[np.random.randint(n, size=n)]
# Out: 10000 loops, best of 3: 159 µs per loop
但即使是提取值、对numpy 数组进行采样并构造一个新的pandas.DataFrame 也更快:
%timeit pandas.DataFrame(df.values[np.random.randint(n, size=n)], columns=columns)
# Out: 1000 loops, best of 3: 302 µs per loop
@JohnE 建议 sample 不幸的是更慢:
%timeit df.sample(n, replace=True)
# Out: 100 loops, best of 3: 5.14 ms per loop
@firelynx 建议merge:
%timeit df.merge(pandas.DataFrame(index=np.random.randint(n, size=n)), left_index=True, right_index=True, how='right')
# Out: 1000 loops, best of 3: 1.23 ms per loop
有谁知道为什么iloc 这么慢和/或是否有比提取值、采样然后构造一个新的pandas.DataFrame 更好的选择?
【问题讨论】:
-
sample()?自 0.16.1 版起的新功能。 pandas.pydata.org/pandas-docs/stable/whatsnew.html#sample -
我添加了您的建议。不幸的是,这甚至更慢。
-
@JohnE,感谢您澄清
np.random.randint花费了大量时间。 -
什么是
columns?您没有在代码中定义它。需要它来重现您的测试。 -
@firelynx,抱歉,有人修改了我的原始帖子。我执行了回滚。