有没有办法一次性有效地选择 numpy 数组或 pandas 数据框中的多个范围?
import pandas as pd
import numpy as np
from time import time
data = pd.DataFrame(np.random.sample((10000,10)))
%timeit -n 10000 result = pd.concat((data[100:150], data[200:300]))
10000 loops, best of 3: 1.47 ms per loop
在上面的示例中,如何在不使用 concat 的情况下从 100 到 150 和 200:300 中进行选择?这可能吗?
上述操作在使用 pd.concat 时存在瓶颈,最终可以使用 np.vstack 加速...但我仍然想一次选择两个范围,而不像 concat 那样复制底层数据做。
时间至关重要,因为如果您直接访问连续范围,我希望尽可能接近您将获得的时间,如下所示:
%timeit -n 10000 result = data[100:150]
10000 loops, best of 3: 94 µs per loop
最佳答案
我能想到的有几种方法。我们可以尝试一下,看看哪个最快。但是,您将无法避免副本。如果没有副本,就无法处理不连续的范围。
连接
>>> %%timeit -n 10000 data = pd.DataFrame(np.random.sample((10000,10)))
... result = pd.concat((data[100:150], data[200:300]))
...
10000 loops, best of 3: 3.81 ms per loop
索引列表
>>> %%timeit -n 10000 data = pd.DataFrame(np.random.sample((10000,10)))
... result = data.iloc[list(range(100, 150))+list(range(200, 300))]
...
10000 loops, best of 3: 479 µs per loop
逻辑索引:
>>> %%timeit -n 10000 data = pd.DataFrame(np.random.sample((10000,10)))
... result = data[((100 <= data.index) & (data.index < 150)) |
... ((200 <= data.index) & (data.index < 300))]
...
10000 loops, best of 3: 580 µs per loop
切片和掉落
>>> %%timeit -n 10000 data = pd.DataFrame(np.random.sample((10000,10)))
... result = data[100:300].drop(np.arange(150, 200))
...
10000 loops, best of 3: 1.22 ms per loop
因此,提供索引列表或逻辑索引似乎是最快的,速度大致相当(我不会对那么小的速度差异给予任何重视)。
关于Python 使用 numpy\pandas 选择多个范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31103926/