Автоматически перемещать строки с одинаковыми пространственными координатами в другой кластерPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Автоматически перемещать строки с одинаковыми пространственными координатами в другой кластер

Сообщение Гость »


У меня есть кадр данных df:

импортировать панд как pd данные = { "широта": [49.5659508, 49.568089, 49.5686342, 49.5687609, 49.5695834, 49.5706579, 49.5711228, 49.5716422, 49.5717749, 49.561957 9, 49.5619579, 49.5628938, 49.5628938, 49.5630028, 49.5633175, 49.56397639999999, 49.566359, 49.56643220000001, 49.56643220 000001, 49.5672061, 49.567729, 49.5677449, 49.5679685 , 49.5679685, 49.5688543, 49.5690616, 49.5713705], "долгота": [10.9873409, 10.9894035, 10.9896749, 10.9887881, 10.9851579, 10.9853273, 10.9912959, 10.9910182, 10.9867083, 10.99957 58, 10.9995758, 11.000319, 11.000319, 10.9990996, 10.9993819, 11.004145, 11.0003023, 10.9999593, 10.9999593, 10.9935709, 11 .0011213, 10.9954016, 10.9982288 , 10,9982288, 10,9975928, 10,9931367, 10,9939141], "кластер": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 , 2, 2, 2, 2], "dup_location_count": [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2 , 2, 0, 0, 0] } df = pd.DataFrame(данные) df.head(11) Кластер широты и долготы dup_location_count 0 49,565951 10,987341 0 0 1 49,568089 10,989403 0 0 2 49,568634 10,989675 0 0 3 49,568761 10,988788 0 0 4 49,569583 10,985158 0 0 5 49,570658 10,985327 0 0 6 49,571123 10,991296 0 0 7 49,571642 10,991018 0 0 8 49,571775 10,986708 0 0 9 49,561958 10,999576 1 2 10 49,561958 10,999576 1 2 Столбцы широта и долгота представляют пространственные координаты людей. Столбец cluster представляет кластер. Люди, живущие в одном здании или рядом друг с другом, обычно находятся в одном кластере. Каждый кластер имеет размер кластера 9 человек. Столбец dup_location_count представляет количество других людей, имеющих точно такие же координаты.

Я ищу автоматический способ перемещения людей, которые находятся в одном кластере, но имеют точно такие же координаты, в другой кластер (см., например, индексы 9 и 10). Предпочтительно в кластер, который «относительно близок» к исходному кластеру. У меня нет точного определения понятия «относительно близко», но кластеры с одинаковым номером кластера ближе друг к другу.

Примечание: убедитесь, что даже после распределения людей по разным кластерам размер кластера останется прежним (9).

В идеале я получаю фрейм данных, в котором каждый кластер содержит людей, которые живут в разных местах, и каждый кластер содержит ровно 9 строк.

Исходный фрейм данных содержит 3 тыс. строк. Поэтому мне нужен какой-то алгоритм для выполнения этой работы. Есть идеи?

Решение вручную

# значений сортировки df.sort_values(by=["кластер", "широта", "долгота"], inplace=True) df.reset_index(drop=True, inplace=True) # поменяться людьми размер_кластера = 9 temp_value = df.loc[2, «кластер»] df.loc[2, "кластер"] = df.loc[2+cluster_size, "кластер"] df.loc[2+cluster_size, "кластер"] = temp_value temp_value = df.loc[4, «кластер»] df.loc[4, "кластер"] = df.loc[4+cluster_size, "кластер"] df.loc[4+cluster_size, "кластер"] = temp_value temp_value = df.loc[5, «кластер»] df.loc[5, "кластер"] = df.loc[5+2*cluster_size, "кластер"] df.loc[5+2*cluster_size, «кластер»] = temp_value temp_value = df.loc[18, «кластер»] df.loc[18, "кластер"] = df.loc[18+cluster_size, "кластер"] df.loc[18+cluster_size, "кластер"] = temp_value temp_value = df.loc[20, «кластер»] df.loc[20, "кластер"] = df.loc[20+cluster_size, "кластер"] df.loc[20+cluster_size, "кластер"] = temp_value # конец кластера, поэтому идем назад df.sort_values(by=["кластер", "широта", "долгота"], inplace=True) сдвиг_значение = размер_кластера - 1 temp_value = df.loc[30, «кластер»] df.loc[30, «кластер»] = df.loc[30-shift_value, «кластер»] df.loc[30-shift_value, «кластер»] = temp_value Таким образом я получаю окончательный результат:
данные = { "широта": [49.5633175, 49.5659508, 49.566359, 49.56643220000001, 49.56643221, 49.567729, 49.567729, 49.568089, 49.5687609, 49.5 630028, 49.5659508, 49.56643220000001, 49.56643221, 49.5686342, 49.5695834, 49.5706579, 49.5716422, 49.5717749, 49.5619579, 49.5628938, 49.5633175, 49.56397639999999, 49.56397639999999 , 49.566359, 49.56643221, 49.5677449, 49.5679685, 49.5619579, 49.5628938, 49.5630028, 49.5672061, 49.5679685, 49.5688543, 49.5690616, 49.5711228, 49.5713705], "долгота": [10.9993819, 10.9999593, 11.0003023, 10.9999593, 11.001122, 10.9982288, 11.0011213, 10.9894035, 10.9887881, 10.987340 9, 10.9873409, 10.9999593, 11.001122, 10.9896749, 10.9851579, 10.9853273, 10.9910182, 10.9867083, 10.9995758, 11.000319, 11 .0003023, 10.9999593, 11.004145 , 10.9935709, 11.001122, 10.9954016, 10.9982288, 10.9995758, 11.000319, 10.9990996, 10.9935709, 10.9982288, 10.9975928, 1 0,9931367, 10,9912959, 10,9939141], "кластер": [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 , 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3] } df = pd.DataFrame(данные)
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»