프로그래밍/파이썬 공부

AttributeError: 'DataFrame' object has no attribute 'append'

이자다 2023. 10. 26. 05:05
반응형

pandas 2.0.0 이후부터는 append를 지원하지 않는다고 한다.

 

기존 코드가 append 함수를 사용하는 것을 전재로 짜여져 있어서 바꿔야 한다.

 

판다스 버전을 낮추는 것도 방법이지만 호환성 문제가 터질 수 있기 때문에 코드를 수정하는 것이 장기적으로는 옳은 방법으로 보인다.

 

append 함수는 concat 함수로 대체되었다.

 

import pandas as pd
 
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                    'B': ['B0', 'B1', 'B2'],
                    'C': ['C0', 'C1', 'C2']},
                   index=[0, 1, 2])
 
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
                    'B': ['B3', 'B4', 'B5'],
                    'C': ['C3', 'C4', 'C5']},
                   index=[3, 4, 5])
 
pd.concat([df1, df2])

위의 pd.concat([df1, df2]) 형식을 지켜야한다.

 

 

 

위 코드처럼 단순히 append를 concat으로 치환만 하면 오류가 나온다.

 

AttributeError: 'DataFrame' object has no attribute 'concat'

 

반드시 concat([df1, df2]) 형식을 지켜야 제대로 동작한다.

 

 

 

 

        #객체들의 중심 좌표 계산
        center_x = []
        center_y = []
        for i in range(len(detections.xyxy)):
          center_x.append(((detections.xyxy[i][0] + detections.xyxy[i][2])//2))
          center_y.append(((detections.xyxy[i][1] + detections.xyxy[i][3])//2))

        # rectangles 리스트의 0~4번 좌표는 동서남북 순이다.
        line_location = ['east', 'west', 'south', 'north']
        
        # rectangles 리스트의 각 사각형 내부에 위치한 차량을 데이터프레임에 기록
        for i, rect in enumerate(rectangles):
            x1, y1, x2, y2 = rect[0][0], rect[0][1], rect[2][0], rect[2][1]
            for j in range(len(center_x)):
                # 현재 사각형 범위에 위치한 차량을 데이터프레임에 기록
                if x1 <= center_x[j] <= x2 and y1 <= center_y[j] <= y2:
                    object_results = object_results.concat({'class_id': detections.class_id[j],
                                                              'tracker_id': detections.tracker_id[j],
                                                              'line_location': line_location[i]},
                                                            ignore_index=True)

기존에 append를 사용하던 코드를 아래와 같이 고친다.

 

다른 곳은 볼 필요 없고 append 부분을 주목하자

 

 

 

 

		# 새로운 데이터를 저장할 리스트 생성
        new_data = []

        # rectangles에 대해 반복하고 현재 사각형 범위에 위치한 차량을 데이터프레임에 기록
        for i, rect in enumerate(rectangles):
            x1, y1, x2, y2 = rect[0][0], rect[0][1], rect[2][0], rect[2][1]
            for j in range(len(center_x)):
                if x1 <= center_x[j] <= x2 and y1 <= center_y[j] <= y2:
                    new_data.append({'class_id': detections.class_id[j],
                                    'tracker_id': detections.tracker_id[j],
                                    'line_location': line_location[i]})

        # 리스트의 데이터를 DataFrame으로 변환하여 연결
        new_data_df = pd.DataFrame(new_data)

        # 기존 DataFrame과 새로운 데이터를 concat 함수로 연결합니다.
        object_results = pd.concat([object_results, new_data_df], ignore_index=True)

새로운 리스트를 만들고 거기에 append한 후 리스트를 데이터프레임으로 변환하고 concat으로 결과물 dataframe에 전달한다.

 

이런 형식으로 변환하면 정상적으로 실행된다.

 

정리하자면 이제 데이터프레임에 바로 append로 행 추가는 불가능하고, list를 만들어 거기에 append 후 list를 행으로 삼아 데이터프레임에 concat 함수로 집어넣어야 한다.

반응형