gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:43:07 26 4
gpt4 key购买 nike

有没有办法一次性高效地选择 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 那样复制底层数据做。

TIME 是至关重要的,因为如果您直接访问连续范围,我希望尽可能接近您获得的时间,如下所示:

%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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com