У меня есть фрейм данных pandas, для которого я установил индекс как один из столбцов (frame_number
), как таковой:
pedestrian_ID pos_x pos_y v_x v_y
frame_number
780.0 1.0 8.456844 3.588066 1.671714 0.176292
786.0 1.0 9.125530 3.658583 1.662877 0.326723
792.0 1.0 9.787146 3.849445 1.683334 0.371084
798.0 1.0 10.472197 3.955450 1.598568 0.264795
804.0 1.0 11.066000 4.061280 1.574526 0.456390
... ... ... ... ... ...
12381.0 357.0 10.449366 6.229233 0.596406 0.066591
12381.0 367.0 11.201661 8.443910 0.000000 0.000000
Теперь я хочу изменить значения индекса на диапазон (0, df['frame_number'].unique())
(от 0 до количества уникальных значений индекса, 'frame_number'
) как таковой:
pedestrian_ID pos_x pos_y v_x v_y
frame_number
0 1.0 8.456844 3.588066 1.671714 0.176292
1 1.0 9.125530 3.658583 1.662877 0.326723
2 1.0 9.787146 3.849445 1.683334 0.371084
3 1.0 10.472197 3.955450 1.598568 0.264795
4 1.0 11.066000 4.061280 1.574526 0.456390
... ... ... ... ... ...
1447 357.0 10.449366 6.229233 0.596406 0.066591
1448 367.0 11.201661 8.443910 0.000000 0.000000
Для приведенного выше конкретного примера, поскольку я знаю, что наименьшее значение для frame_number
равно 780 и что каждое последующее frame_number
увеличивается на 6, я могу сделать это:
df.index = (df.index - 780).astype(int) // 6
Чтобы сделать это в более общем виде (если мой индексированный столбец не подчиняется такому шаблону), я могу сделать:
d = {frame: i for i, frame in enumerate(df['frame_number'].unique())}
df.index = np.array([d[frame] for frame in df.index])
Есть ли лучший способ сделать это, желательно в пандах?
Просто чтобы быть более ясным, я не хочу поглощать индекс обратно в фрейм данных, как это сделал бы df.reset_index()
, а хочу сохранить индекс, но изменить его значения на диапазон.
Вы можете преобразовать свой индекс в pandas Категориальный, а затем заменить свой индекс кодами категорий:
df.index = pd.Categorical(df.index).codes
Спасибо, это решение - ловкий трюк.