#python #pandas #logic
#python #pandas #Логические
Вопрос:
Я работаю с координатами длины и широты в Python и пытаюсь найти расстояние между двумя сайтами во фрейме данных, однако я изо всех сил пытаюсь выяснить, как это сделать в pandas. если long = x и lat = y, я понимаю логику вычисления расстояния sqrt ((x1-x2) ^ 2 (y1-y2) ^ 2), но я не понимаю, как я мог бы сделать это во фрейме данных. Моя задача дополнительно усложняется тем фактом, что я пытаюсь найти 3 лучших сайта, которые находятся ближе всего к сайту в строке 1 (в конечном итоге мне приходится перебирать все строки).
Вопрос в том, есть ли лучший способ решить эту проблему, чем перебирать строку за строкой? Поскольку мне также нужно найти ближайшие k сайтов к каждой строке, я не уверен, что iterrow () будет лучшим решением, но я не могу придумать более умный матричный способ решения этой проблемы. Смотрите пример данных ниже. Итак, мне нужен столбец «Ближайшие сайты», и для строки 1 ближайшими сайтами будут: 6, за которыми следует 4, затем 5, поэтому мне нужно, чтобы строка 1 отображалась следующим образом:
Спасибо.
пример данных:
Ответ №1:
Numpy делает это простым даже с огромными наборами данных. Смотрите ниже.
# Turn Pandas dataframe into ndarray
data = data.to_numpy(dtype='float')
# Make a reference array out of first row
ref = np.tile(data[0], (data.shape[0], 1))
# Use vectorized computation to find distance for each site
dist = (data[:,1:3] - ref[:,1:3]) ** 2 # Replace 1:3 with appropriate column indices for lat and long
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist).resize((data.shape[0], 1))
# Concatenate distance on to data
data = np.concatenate((data, dist), axis=1)
# Sort resulting ndarray by distance
data = data[np.argsort(data[:,-1])]
# Get IDs of 3 closest sitaes
ids = [data[i, 0] for i in range(1, 4)]
Этот код быстро возвращает вам значения идентификаторов трех ближайших сайтов к первой строке ваших данных. Если вы хотите найти 3 ближайших сайта к другим строкам, просто измените np.tile(data[0], (data.shape[0], 1))
на np.tile(data[i], (data.shape[0], 1))
для i-й строки. Если вы собираетесь делать это для нескольких строк, также было бы разумно каждый раз создавать копию ваших данных и использовать ее, чтобы ваши исходные данные оставались неизменными.
Как только у вас будут идентификаторы ближайших сайтов, вы сможете делать с ними все, что захотите. Поместите их в другую таблицу, чтобы они выглядели красиво, или делайте с ними, что хотите. Если вам нужно превратить ndarray обратно в фрейм данных Pandas, просто используйте pandas.DataFrame(ndarray)
.
Комментарии:
1. Спасибо! Намного эффективнее, чем то, что я планировал сделать! Теперь, чтобы попытаться понять это!