从pandas.DataFrame中绘制一个bootstrap示例

时间:2015-07-19 15:42:43

标签: numpy pandas

我想尽可能有效地绘制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

2 个答案:

答案 0 :(得分:2)

pandas中的合并方法已经相当优化,所以我试试了它,它给了我一个显着的速度提升。鉴于我的机器比你的慢一点,我也使用pandas 0.15.2事情可能会有所不同。

%timeit df.iloc[np.random.randint(n, size=n)]
# 100 loops, best of 3: 2.41 ms per loop

randlist = pandas.DataFrame(index=np.random.randint(n, size=n))
%timeit df.merge(randlist, left_index=True, right_index=True, how='right')
# 1000 loops, best of 3: 1.87 ms per loop

%timeit df.merge(pandas.DataFrame(index=np.random.randint(n, size=n)), left_index=True, right_index=True, how='right')
# 100 loops, best of 3: 2.29 ms per loop

答案 1 :(得分:0)

索引速度

测试布尔索引对我来说稍微快一些:

布尔索引

%timeit -n10000 df[np.random.randint(2, size=n).astype(bool)]
# 10000 loops, best of 3: 307 µs per loop

numpy采样&再DataFrame荷兰国际集团

%timeit -n10000 pandas.DataFrame(df.values[np.random.randint(n, size=n)], columns=columns)
# 10000 loops, best of 3: 380 µs per loop