Объединить кадры данных по ближайшим координатам - PullRequest
0 голосов
/ 15 января 2020

Представьте, что у нас есть 2 кадра данных с координатами ['X', 'Y']:

df1:

 X            Y          House №
2531        2016           175
2219        2196           11
2901        3426           201
6901        4431           46
7891        1126           89

df2:

 X            Y      Delivery office №
2534        2019            O1
6911        4421            O2
2901        3426            O3
7894.5      1120            O4 

Моя идея это объединить их и получить:

df3

 X            Y          House №    Delivery office №
2531        2016           175            01
2219        2196           11             NA
2901        3426           201            03
6901        4431           46             02
7891        1126           89             04

Таким образом, мы хотим реализовать «нечеткое» слияние по порогу (этот параметр должен быть задан пользователем). Вы можете видеть, что дом № 11 не получил номер офиса доставки, потому что он расположен далеко от всех представленных офисов в df2.

Поэтому мне нужны все строки из df2 'найдите', это ближайший ряд из df1 и добавьте к нему значение 'Cost'. Вы можете видеть, что обычный in-box pd.merge там не работает, а также пользовательские пакеты, которые реализуют нечеткую логику c относится к строковым значениям с использованием расстояния Левенштейна и т. д.

1 Ответ

0 голосов
/ 15 января 2020

Нет серебряной пули, но способ сделать это - повернуть значения Y в категориях, используя pd.cut. Используя этот метод, он поместит значения в разные ячейки. Вам необходимо настроить ячейки вручную, например, установить их на 20.

Загрузить данные:

df1 = pd.DataFrame({'X':[2531, 2219, 2901, 6901, 7891], 'Y':[2016, 2196, 3426, 4431, 1126], 'House':['A', 'B', 'J', 'A', 'A']})

df2 = pd.DataFrame({'X':[2534, 6911, 2901, 7894.5], 'Y':[2019, 4421, 3426, 1120], 'Cost':[1200, 3100, 800, 600]})

Создать новые категории:

df1['Y2'] = pd.cut(df1['Y'], 20, labels=False)

df2['Y2'] = pd.cut(df2['Y'], 20, labels=False)

df3 = pd.merge(df1, df2, on=['Y2'], how='left')
...