#python #pandas #numpy
#python #pandas #numpy
Вопрос:
Я хочу создать новый столбец со всеми координатами, которые автомобиль должен передать определенной цели. Это должно быть в виде списка в panda.
Для начала у меня есть это:
import pandas as pd
cars = pd.DataFrame({'x_now': np.repeat(1,5),
'y_now': np.arange(5,0,-1),
'x_1_goal': np.repeat(1,5),
'y_1_goal': np.repeat(10,5)})
вывод будет:
x_now y_now x_1_goal y_1_goal
0 1 5 1 10
1 1 4 1 10
2 1 3 1 10
3 1 2 1 10
4 1 1 1 10
Я пытался добавить новые столбцы, подобные этому, и это не сработало
for xy_index in range(len(cars)):
if cars.at[xy_index, 'x_now'] == cars.at[xy_index,'x_1_goal']:
cars.at[xy_index, 'x_car_move_route'] = np.repeat(cars.at[xy_index, 'x_now'].astype(int),(
abs(cars.at[xy_index, 'y_now'].astype(int)-cars.at[xy_index, 'y_1_goal'].astype(int))))
else:
cars.at[xy_index, 'x_car_move_route'] =
np.arange(cars.at[xy_index,'x_now'], cars.at[xy_index,'x_1_goal'],
(cars.at[xy_index,'x_1_goal'] - cars.at[xy_index,'x_now']) / (
abs(cars.at[xy_index,'x_1_goal'] - cars.at[xy_index,'x_now'])))
в конце мне нужны столбцы x_car_move_route и y_car_move_route, чтобы я мог перебирать координаты, которые им нужно передать. Я покажу это с помощью tkinter. Я также добавлю больше целей, поскольку на самом деле это только первый ход, который им нужно сделать.
x_now y_now x_1_goal y_1_goal x_car_move_route y_car_move_route
0 1 5 1 10 [1,1,1,1,1] [6,7,8,9,10]
1 1 4 1 10 [1,1,1,1,1,1] [5,6,7,8,9,10]
2 1 3 1 10 [1,1,1,1,1,1,1] [4,5,6,7,8,9,10]
3 1 2 1 10 [1,1,1,1,1,1,1,1] [3,4,5,6,7,8,9,10]
4 1 1 1 10 [1,1,1,1,1,1,1,1,1] [2,3,4,5,6,7,8,9,10]
Комментарии:
1. Что
arange
car_move_routes
должен означать интервал предполагаемого значения? Похоже, что это всегда будет 1, -1 или NaN:(x1goal - xnow) / abs(x1goal - xnow)
2. car_move_routes — это все координаты, которые будет принимать car. (x1goal — xnow) / abs(x1goal — xnow) должно быть 1 или -1, так как я хочу, чтобы он переместился на следующий x. Однако я вижу, что мне нужен другой подход к случаю, когда x_now и x_goal совпадают.
Ответ №1:
Вы можете apply()
использовать что-то вроде этой route()
функции axis=1
, что означает route()
, что вы будете получать строки из cars
. Он генерирует либо x
координаты, либо y
координаты в зависимости от того, что передается в var
(из args
).
Вы можете настроить / исправить по мере необходимости, но это должно помочь вам начать:
def route(row, var):
var2 = 'y' if var == 'x' else 'x'
now, now2 = row[f'{var}_now'], row[f'{var2}_now']
goal, goal2 = row[f'{var}_1_goal'], row[f'{var2}_1_goal']
diff, diff2 = goal - now, goal2 - now2
if diff == 0:
result = np.array([now] * abs(diff2)).astype(int)
else:
result = 1 np.arange(now, goal, diff / abs(diff)).astype(int)
return result
cars['x_car_move_route'] = cars.apply(route, args=('x',), axis=1)
cars['y_car_move_route'] = cars.apply(route, args=('y',), axis=1)
x_now y_now x_1_goal y_1_goal x_car_move_route y_car_move_route
0 1 5 1 10 [1,1,1,1,1] [6,7,8,9,10]
1 1 4 1 10 [1,1,1,1,1,1] [5,6,7,8,9,10]
2 1 3 1 10 [1,1,1,1,1,1,1] [4,5,6,7,8,9,10]
3 1 2 1 10 [1,1,1,1,1,1,1,1] [3,4,5,6,7,8,9,10]
4 1 1 1 10 [1,1,1,1,1,1,1,1,1] [2,3,4,5,6,7,8,9,10]
Комментарии:
1. Большое вам спасибо. Это работает великолепно. Теперь я научусь настраивать его для реальных данных.