如何列出属于一组范围的所有数字对?

Abd*_*ran 6 python performance pandas data-science

假设我有数据帧df1,其中包括两列 - A和B.A值表示较低范围,B值表示较高范围.

  A     B
10.5  20.5
30.5  40.5
50.5  60.5
Run Code Online (Sandbox Code Playgroud)

我有另一个数据框,其中包括两列 - 包含不同数字范围的C&D.

  C     D
12.34  15.90
13.68  19.13
33.5   35.60
35.12  38.76
50.6   59.1
Run Code Online (Sandbox Code Playgroud)

现在我想列出df2中属于df1组(在低范围和高范围之间)的所有对.

最终输出应该是这样的 -

     Key                Values
(10.5, 20.5)  [(12.34, 15.90), (13.68, 19.13)]
(30.5, 40.5)  [(33.5, 35.60), (35.12, 38.76)]
(50.5, 60.5)  [(50.6, 59.1)]
Run Code Online (Sandbox Code Playgroud)

解决方案应该是高效的,因为我有5000组范围和85000个不同范围的数字.

Jac*_*uot 2

在我的计算机上,它的速度不是很快(约 30 秒),但multiprocessing如果您有多个内核,则可以轻松地通过该包加速。

生成数据:

def get_fake(n):
    df = pd.DataFrame(np.random.rand(n * 2).reshape(-1, 2))
    df.loc[:, 1] += 1
    return df

df1 = get_fake(200)
df2 = get_fake(90000)
Run Code Online (Sandbox Code Playgroud)

然后对于处理部分:

from collections import defaultdict
result = defaultdict(list)
for index, start, stop in df1.itertuples():
    subdf = df2[(start < df2.iloc[:, 0]) & (df2.iloc[:, 1] < stop)]
    result[(start, stop)] += subdf.values.tolist()
Run Code Online (Sandbox Code Playgroud)

结果是一个字典,但如果需要,可以轻松转换为系列。