(python) 특정 조건으로 모든 행 업데이트하기
- apply 이용
판다스에서는 for문보다 apply를 애용합시다.
(python) 특정 조건으로 모든 행 업데이트하기 - apply 이용
1. 문제 발생
4개의 테이블로 구성된 데이터베이스가 있다.
각 테이블은 지역코드를 레코드로 가지고 있다.
그런데 2개의 테이블은
지역코드를 8자리의 형태로 가지고 있는 반면,
나머지 2개의 테이블은
지역코드를 10자리의 형태로 가지고 있다.
데이터를 살펴보니,
10자리 형태의 지역코드는
8자리 지역코드에 “00”를 붙인 형태였다.
고민끝에
데이터 작업 편의를 위해
지역코드를 모두 10자리로 통일해주기로 했다.
전처리는 8자리 코드를 문자형으로 바꾼후
“00”을 첨부해주는 방식으로 진행하려 했다.
이를 위해 for문을 사용하였다.
for i in range(adstrd_master["adstrd_code"].count()):
adstrd_master["adstrd_code"][i]=str(adstrd_master["adstrd_code"][i])+"00"
다행히 전처리가 필요한 첫번째 테이블은
다음과 같이 레코드 업데이트가 잘 되었다.
그리고 두번째 테이블을 전처리하기로 했다.
여기서 문제가 발생했다.
파일크기가 250kb로 크지 않았던
첫번째 테이블과 달리,
두번째 테이블은 용량이 무려 2GB에 달하고 ,
레코드수는 5000만개가 넘어가는
거대한 테이블이었다.
for문을 이용하여 전처리를 진행하는데,
몇 시간이 지나도 계속 “처리중”상태로 뜨는 것이었다.
아무리 용량이 크다고 해도,
수 시간동안 레코드를 업데이트 하는 것은
이상하다는 생각이 들었다.
결국 for문을 이용한 방법이 문제가 있는 것 같아
다른 방식을 찾아보기로 했다.
2. 해결 방법
pandas의 apply 메소드를 이용하면
간단히 해결 가능하다.
pandas 데이터프레임은
구조상 for문을 이용하여
데이터를 업데이트하면
시간이 상당히 오래 걸린다고 한다.
이럴경우 apply메소드를 통해
데이터를 빠르게 업데이트 할 수 있다.
fpopl['adstrd_code']=fpopl['adstrd_code'].apply(lambda x: str(x)+"00")
apply와 lambda를 활용하여 코드를 작성하면 된다.
apply는 lambda에 적용된 함수를 객체에 적용시켜주는 메소드이다.
놀랍게도,
전처리 작업이 30초 안에 끝났다.
(for문으로는 3시간 넘어도 안되던 작업이…. 😅)
3. 배운 점 및 피드백
- pandas 데이터프레임에서 for문 사용을 자제하자.
- apply 메소드를 이용하면 레코드를 빠르게 업데이트 할 수 있다.
- apply 메소드와 map 메소드의 차이를 알아보자.