【发布时间】:2021-09-23 06:06:44
【问题描述】:
我有两个数据框。数据框 A 的形状为 (1269345,5),数据框 B 的形状为 (18583586, 3)。
数据框 A 如下所示:
Name. gender start_coordinate end_coordinate ID
Peter M 30 150 1
Hugo M 4500 6000 2
Jennie F 300 700 3
数据框(B)看起来像
ID_sim. position string
1 89 aa
4 568 bb
5 938437 cc
我想提取行并制作两个数据框,其中数据框 B 中的位置列落在数据框 A 中的区间(由 start_coordinate 和 end_coordinate 列指定)中。因此生成的数据框如下所示:
###Final dataframe A
Name. gender start_coordinate end_coordinate ID
Peter M 30 150 1
Jennie F 300 700 3
###Final dataframe B
ID_sim. position string
1 89 aa
4 568 bb
我尝试像这样使用 numpy 广播:
s, e = dfA[['start_coordinate', 'end_coordinate']].to_numpy().T
p = dfB['position'].to_numpy()[:, None]
dfB[((p >= s) & (p <= e)).any(1)]
但这给了我以下错误:
MemoryError: 无法为形状为 (18583586, 160711) 且数据类型为 bool 的数组分配 2.72 TiB
我认为这是因为当我尝试广播时,我的 numpy 变得非常大。考虑到我的数据帧非常大,如何在没有 numpy 广播的情况下完成我的任务。我们将不胜感激。
【问题讨论】:
标签: python-3.x pandas numpy-ndarray