pd.DataFrame перезаписывает столбцы, а не сохраняет данные в pd.DataFrame - PullRequest
0 голосов
/ 24 октября 2019

Здесь я пытаюсь создать фрейм данных для сравнения местоположения объекта между фреймами:

Pcount = []
Pcountdb = []
framenumber = 0
frames_count = 0
frames_count = self.vdo.get(cv2.CAP_PROP_FRAME_COUNT)
df = pd.DataFrame(index=range(int(frames_count))) 
if len(outputs) > 0:
    for i in range(len(outputs):
        bbox_xyxy = outputs[:,:4]
        identities = outputs[:,-1]
        sx = outputs[:,0]
        sy = outputs[:,1]
        ex = outputs[:,2]
        ey = outputs[:,3]
        cx = ((sx + ex) /2)
        cy = ((sy + ey) /2)
        ct = (cx, cy)
        cx2 = (cx.tolist())
        cy2 = (cy.tolist())
        P = identities[i]
        df[str(P.astype(int))] = ""                              
        #creates new column with an id number obtained through deepsort

        df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]  
        #the i function from a for loop is necessary for multiple objects in the same frame

        print(df)

        if not P in Pcountdb:
            global PcountT
            Pcountdb.append(P)
            PcountT = PcountT + 1

framenumber = framenumber + 1

Отредактировано: приведенный выше скрипт начинается с заполнителей

df = pd.DataFrame... создает мой фрейм данных со строкой для каждого изображения / кадра в моем видео

bbox_xyxy создается после того, как мой детектор объектов был зациклен с помощью deepsort, и deepsort идентифицировал каждый обнаруженный объект и идентифицировал его как объектс местоположением.

Затем разбейте np.arrays и вычислите центральные точки этих объектов, чтобы их можно было рассматривать как отдельную точку вместо прямоугольника ограничивающего прямоугольника.

Pandas берет мои входные данные и создает DataFrame с идентификатором объекта (в данном случае 1), координатами xy центра и помещает их в строку, соответствующую каждому кадру

, затем мы печатаем кадр данных и просматриваем результаты

print (df) возвращает:

                     1
Frames                
3       [614.5, 632.0]

                     1
Frames                
3                     
4       [610.5, 624.0]

                     1
Frames                
3                     
4                     
5       [603.0, 618.0]

                     1
Frames                
3                     
4                     
5                     
6       [574.0, 615.5]

                     1
Frames                
3                     
4                     
5                     
6                     
7       [564.0, 610.0]

                     1
Frames                
3                     
4                     
5                     
6                     
7                     
8       [559.0, 597.0]

DataFrame отслеживает ТОЛЬКО самый последний набор координат в column. Если бы мне пришлось создать два столбца, в моем фрейме данных будет присутствовать только последнее обнаружение каждого объекта (как показано выше с одним объектом, идентифицированным как 1)

Мне нужно сохранить выходные данные в моем pd.DataFrame. = df, вместо перезаписи.

                     1
Frames                
3       [614.5, 632.0]
4       [610.5, 624.0]
5       [603.0, 618.0]
6       [574.0, 615.5]
7       [564.0, 610.0]
8       [559.0, 597.0]

Таким образом, я могу сравнивать местоположения этих объектов между кадрами, давая мне счетчик объектов, который считает объекты и сохраняет их в 2 базах данных: «ВВЕРХ» и «ВНИЗ»

Ответы [ 2 ]

0 голосов
/ 25 октября 2019
for i in range(len(outputs)):
                    P = identities[i]

                    if not P in Pcountdb:
                        df[str(P.astype(int))] = ""
                        global PcountT
                        Pcountdb.append(P)
                        PcountT = PcountT + 1
                    else:
                        if P in Pcountdb:
                            df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]


[222 rows x 1 columns]
                     1
 Frames                
 4       [610.5, 624.0]
 5       [603.0, 618.0]
 6       [574.0, 615.5]
 7       [564.0, 610.0]
 8       [559.0, 597.0]
 ...                ...
 226     [640.5, 518.5]
 227     [643.0, 525.0]
 228     [646.0, 529.5]
 229     [647.5, 529.5]
 230     [650.5, 531.5]

Спасибо @Adarsh ​​за ваш ответ, вы были правы, мои столбцы перезаписывались, потому что я создавал их из цикла.

Я взял строку df [str (P.astype (int))] = "", где столбцы создаются и запускаются с исключительным обстоятельством.

0 голосов
/ 25 октября 2019

Ваш DataFrame просто добавляет последний raw, потому что каждый раз при запуске цикла вы сбрасываете столбец в ноль. поэтому все предыдущие значения стираются. Посмотрев на ваш код, я вижу, что ваш код не требует включения цикла.

решение :

Pcount = []
Pcountdb = []
framenumber = 0
frames_count = 0
frames_count = self.vdo.get(cv2.CAP_PROP_FRAME_COUNT)
df = pd.DataFrame(index=range(int(frames_count))) 
if len(outputs) > 0:
    bbox_xyxy = outputs[:,:4]
    identities = outputs[:,-1]
    sx = outputs[:,0]
    sy = outputs[:,1]
    ex = outputs[:,2]
    ey = outputs[:,3]
    cx = ((sx + ex) /2)
    cy = ((sy + ey) /2)
    ct = (cx, cy)
    cx2 = (cx.tolist())
    cy2 = (cy.tolist())
    P = identities[i]
    df[str(P.astype(int))] = ""
    for i in range(len(outputs):
        df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]
        print(df)

Надеюсь, это сработает.

...