반응형
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 함수로 집어넣어야 한다.
반응형