본문 바로가기

공부방/Upstage AI Lab 4기

데이터프레임 merge할 때 중복값 때문에 shape이 망가진다면

어제 밤에 아파트 거래 데이터의 x, y 좌표(위도, 경도) 결측치를 모두 채워주는 작업을 했었는데, 오늘 계속 전처리하려고 보니 shape이 달라져 있었다. 아래는 문제를 해결했던 과정.

원래 데이터셋은 학습용과 테스트용으로 나뉜채 주어졌다. 이 두 개의 데이터셋을 합친 다음에, 둘을 구분해주기 위해 ['is_test']라는 컬럼을 추가한 뒤에 concat이라는 이름으로 다시 데이터프레임을 저장했다. 

concat.shape은 (1128094, 53)이고, 이 상태에서 x, y 좌표 결측치를 채우고 확인해보니 (1141120, 40)가 되어 있던 것! 

주소와 x, y 좌표를 매치시켜놓은 데이터셋('xy'라는 데이터셋으로 데이터프레임을 저장함)과 머징하는 과정에서 뭔가 문제가 생겼다. 주소와 x, y 좌표를 매치시켜놓은 데이터셋은 부트캠프의 다른 능력자님들이 공유해주신 csv 파일을 다운받았다(크롤링하는 방법도 있다는데, 할 게 많아서 일단 크롤링까지는 못하겠고 쉬운 길로.)

중복된 주소를 찾아보니, 같은 주소에 x, y가 각기 다르게 들어간 것들이 다수 발견됐다. 이것 때문에 행이 늘어난 것이구나!

솔직히 주소를 하나하나 찾아가며 위도 경도를 확인하면 베스트이겠지만, 딱히 방법이 떠오르지 않는다. 그냥 하나만 남기고 모두 지우는걸로.. 클로드에게 물어보니, 아래 함수를 쓰면 된다고. 

#주소의 첫 번째로 나타난 행만 유지되고 나머지 중복된 행은 제거
xy_unique = xy.drop_duplicates(subset='주소')

#다시 merge!
merge_3 = pd.merge(concat, xy_unique, on='주소', how="left")

merge_3.shape
#결과: (1128094, 58)

 

 

됐다!

 

+추가 예시

import pandas as pd

# 샘플 데이터
xy = pd.DataFrame({
    '주소': ['A', 'B', 'A', 'C', 'B'],
    '값1': [1, 2, 3, 4, 5],
    '값2': ['x', 'y', 'z', 'w', 'v']
})

print("원본 데이터:")
print(xy)

xy_unique = xy.drop_duplicates(subset='주소')

print("\n중복 제거 후:")
print(xy_unique)

원본 데이터:
  주소  값1 값2
0  A   1  x
1  B   2  y
2  A   3  z
3  C   4  w
4  B   5  v

중복 제거 후:
  주소  값1 값2
0  A   1  x
1  B   2  y
3  C   4  w