Вычислить np.arange внутри фрейма данных Panda из других столбцов

#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. Большое вам спасибо. Это работает великолепно. Теперь я научусь настраивать его для реальных данных.