Как найти похожие GPS-координаты в строках одного столбца? - PullRequest
0 голосов
/ 08 октября 2019

Есть ли способ определить, какие координаты GPS представляют одно и то же местоположение. например, учитывая следующий фрейм данных. Как определить, что идентификаторы 1 и 2 находятся в одном и том же исходном местоположении.

+-----+--------------+-------------+
| Id  |    VehLat    |   VehLong   |
+-----+--------------+-------------+
|  66 |   63.3917005 |  10.4264724 |
| 286 |    63.429603 |  10.4167367 |
|  61 |   33.6687838 |  73.0755573 |
|  67 |   63.4150316 |  10.3980401 |
|   5 |    64.048128 |   10.083776 |
|   8 |   63.4332386 |  10.3971859 |
|   9 |   63.4305769 |  10.3927124 |
|   6 |   63.4293578 |  10.4164764 |
|   1 |    64.048254 |   10.084230 |
+-----+--------------+-------------+

Теперь идентификаторы 5 и 1 в основном совпадают, но каков наилучший подход для классификации этих двух местоположений как одинаковых.

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

IIUC, вам это нужно.

df[['VehLat','VehLong']].round(3).duplicated(keep=False)

Вы можете изменить число в пределах round, чтобы настроить то, что вы считаете "тем же самым"

Выход

0    False
1    False
2    False
3    False
4     True
5    False
6    False
7    False
8     True

Если вам нужен сам df с дублирующимися значениями, вы можете сделать следующее:

df[df[['VehLat','VehLong']].round(2).duplicated(keep=False)]

ИЛИ

df.loc[df[['VehLat','VehLong']].round(2).duplicated(keep=False)]

Вывод

    id         VehLat   VehLong
1   286     63.429603   10.416737
4   5       64.048128   10.083776
7   6       63.429358   10.416476
8   1       64.048254   10.084230
1 голос
/ 08 октября 2019

Использовать DataFrame.sort_values ​​ + Series.between :

это дает вам большую гибкость при установлении критериев для рассматривают две координаты как эквивалентные

df2=df[['VehLat','VehLong']].sort_values(['VehLong','VehLat'])
eq=df2.apply(lambda x: x.diff().between(-0.001,0.001)).all(axis=1)

df2[eq|eq.shift(-1)]

это возвращает фрейм данных с эквивалентными координатами


      VehLat    VehLong
4  64.048128  10.083776
8  64.048254  10.084230
7  63.429358  10.416476
1  63.429603  10.416737

df2[~(eq|eq.shift(-1))]

возвращает уникальные координаты


      VehLat    VehLong
6  63.430577  10.392712
5  63.433239  10.397186
3  63.415032  10.398040
0  63.391700  10.426472
2  33.668784  73.075557

вы можете восстановить порядок, используя DataFrame.sort_index

df_noteq=df2[~(eq|eq.shift(-1))].sort_index()
print(df_noteq)

      VehLat    VehLong
0  63.391700  10.426472
2  33.668784  73.075557
3  63.415032  10.398040
5  63.433239  10.397186
6  63.430577  10.392712
...