【发布时间】:2017-04-08 01:09:37
【问题描述】:
我有一个包含对象及其坐标的 DataFrame:
id lat lng
0 3816 18.384001 -66.114799
1 5922 20.766100 -156.434998
2 1527 21.291394 -157.843085
3 1419 21.291394 -157.843085
4 1651 21.291394 -157.843085
多个对象可以有相同的坐标。数据框很大(数百万条记录)。我有一个坐标为(target_lat, target_lng) 的目标点。我的目标是尽可能高效地在数据框中找到距离目标点 X 英里以内的对象。
我正在使用改编自 this question 的 haversine_np 函数。它接受参数(lat_series, lng_series, lat, lng) 并有效地计算lat_series, lng_series(两个系列)和(lat, lng)(两个数字)之间的所有距离。
现在我的问题是如何使用它来过滤距离并选择原始数据框中的对象。
这是我目前的解决方案:
grouper = df.groupby(['lat', 'lng'], sort=False).grouper
lat_series = grouper.result_index.get_level_values(0) # lats of unique (lat, lng) pairs
lng_series = grouper.result_index.get_level_values(1) # lngs of unique (lat, lng) pairs
df['location_index'] = grouper.group_info[0] # assign index of group back to df
distances = haversine_np(lat_series, lng_series, target_lat, target_lng)
mask = distances <= 50 # let's say 50 miles; boolean mask of size = ngroups
loc_indexes = pd.Series(range(grouper.ngroups))[mask] # select group indexes by mask
df[df.location_index.isin(loc_indexes)] # select original records by group indexes
它似乎有效,虽然看起来不可靠,因为当我使用pd.Series(range(grouper.ngroups))[mask] 选择相关组索引时,我假设分组的级别值自然索引(从 0 到 ngroups-1)。换句话说,我依赖于grouper.result_index.get_level_values() 中的i-th 元素对应于grouper.group_info[0] 中带有标签i 的组这一事实。我找不到更明确的方法来获取该映射。
问题:
- 我使用的方法可靠吗?
- 有没有更好(更安全/更简洁/更高效)的方法?
【问题讨论】:
标签: python pandas dataframe group-by split-apply-combine