Приношу извинения за (потенциально) плохой заголовок, но мне трудно понять, как это описать. У меня есть набор данных, который при чтении в pandas фрейм данных имеет примерно следующую форму:
import pandas as pd
import numpy as np
df_all = pd.DataFrame(np.random.randn(2, 6), columns=["0_X", "0_Y", "1_X", "1_Y", "2_X", "2_Y"])
0_X 0_Y 1_X 1_Y 2_X 2_Y
0 1.470289 0.588573 1.303684 1.374806 1.025082 0.316623
1 0.426527 2.036558 0.100993 2.485025 0.350100 0.603069
Каждая пара столбцов с одинаковым номером представляет позиции (X, Y) для объекта в заданная временная метка. Каждая строка представляет новую метку времени. Что я хотел бы сделать, так это преобразовать этот фрейм данных во что-то вроде этого:
Time ObjectId X Y
0 0 0 1.470289 0.588573
1 0 1 1.303684 1.374806
2 0 2 1.025082 0.316623
3 1 0 0.426527 2.036558
4 1 1 0.100993 2.485025
5 1 2 0.350100 0.603069
Теперь я знаю, что могу извлечь соответствующую информацию из столбца names и повторить это так:
obj_ids = []
for each_column in list(df_all.columns):
obj_id = each_column.split("_")[0]
if obj_id not in obj_ids:
obj_ids.append(obj_id)
df_all_rotated = pd.DataFrame()
df_all_rotated["ObjectID"] = obj_ids
df_all_rotated = pd.concat([df_all_rotated ] * len(df_all.index), ignore_index=True)
Это дает нечто близкое к первой части того, что я хочу:
ObjectId
0 0
1 1
2 2
3 0
4 1
5 2
Но, к сожалению, я застреваю, когда думаю, как переместить точки (X, Y) в их правильные позиции в фрейме данных. Я знаю, что есть способы сделать это, перебирая весь фрейм данных и устанавливая для каждой ячейки фрейма данных соответствующее значение, но они кажутся неэффективными, особенно с учетом того, что наборы данных будут в мегабайтах информации, а у меня плохая (время выполнения) опыт использования "C -подобных" методов зацикливания в Pandas.
Простой ответ - «изменить набор данных», но, к сожалению, я не контролирую, как он создается: (
Любая помощь приветствуется! Мои извинения, если это репост.