Python 使用 numpy\pandas 选择多个范围

标签 python numpy pandas range

有没有办法一次性有效地选择 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/

相关文章:

python - Django:列表索引超出范围

python - 不止一个条件满足numpy select

python - 从双循环追加数据

python - 用户警告 : Pandas doesn't allow columns to be created via a new attribute name -

python - 迭代合并

python-2.7 - "tuple index out of range"读取pandas pickled面板

python - 如何将 Numpy 数组转换为 Panda DataFrame

python - 从python cgi执行用户shell命令

python - 无法在 python 3.7 上安装 igraph

python - 在 numpy 数组中查找缺失值