我想pandas.DataFrame
尽可能有效地绘制一个bootstrap样本.将内置命令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
Run Code Online (Sandbox Code Playgroud)
索引numpy
数组当然要快得多:
%timeit values[np.random.randint(n, size=n)]
# Out: 10000 loops, best of 3: 159 µs per loop
Run Code Online (Sandbox Code Playgroud)
但即使提取值,对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
Run Code Online (Sandbox Code Playgroud)
@JohnE建议sample
哪个更慢:
%timeit df.sample(n, replace=True)
# Out: 100 loops, best of 3: 5.14 ms per loop
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么iloc
这么慢和/或是否有比提取值,采样然后构建新的更好的替代方案pandas.DataFrame
?
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8942 次 |
最近记录: |