我有以下带有x和y定义的bin的网格,每个网格正方形都有一个唯一的id
mapping = pd.DataFrame({'id': [1,2,3,4,5,6,7,8,9], 'x': [1,1,1,2,2,2,3,3,3], 'y': [1,2,3,1,2,3,1,2,3]})
id x y
0 1 1 1
1 2 1 2
2 3 1 3
3 4 2 1
4 5 2 2
5 6 2 3
6 7 3 1
7 8 3 2
8 9 3 3
我还有一个新的观测数据框,我想知道它们的关联ID应该是什么(例如,它们属于哪个网格正方形)
coordinates = pd.DataFrame({'x': [1.4, 2.7], 'y': [1.9, 1.1]})
x y
0 1.4 1.9
1 2.7 1.1
我的解决方案是以下功能:
import bisect
def get_id(coords, mapping):
x_val = mapping.x[bisect.bisect_right(mapping.x, coords[0]) - 1]
y_val = mapping.y[bisect.bisect_right(mapping.y, coords[1]) - 1]
id = mapping[(mapping.x == x_val) & (mapping.y == y_val)].iloc[0, 0]
return id
coordinates.apply(get_id, mapping = mapping, axis = 1)
Out[21]:
0 1
1 4
dtype: int64
这有效,但随着坐标数据帧的增长而变慢。我敢肯定,对于具有10 ^ 6 +观测值的坐标数据框,有一种快速的方法。有更快的方法吗?
编辑:
要从以下评论中回答@ abdurrehman245问题。
我当前的方法是简单地四舍五入任何数据点,这使我可以使用包含任何给定ID的最小值条目(箱)的映射数据框将其映射到ID。因此,x=1.4 y=1.9
舍入到x=1 y=1
,它根据id=1
映射到mapping
。
也许这种笛卡尔可视化使这一点更加清晰:
Y
4 -------------------------
| 3 | 6 | 9 |
| | | |
3 -------------------------
| 2 | 5 | 8 |
| | | |
2 -------------------------
| 1 | 4 | 7 |
| | | |
1 ------------------------- X
1 2 3 4
我还要补充一点,我不能使用floor函数,因为bin不一定是本例中的整数。