본문 바로가기
동굴 속 정보

데이터 전처리의 핵심은 apply 이다.

by 도시형닌자 2020. 4. 22.

[ 데이터프래임, DataFrame ]

우리는 간단한 데이터를 보기 좋게 확인할 때 엑셀(Excel)을 사용한다.

그리고 엑셀에 데이터를 시트(Sheet)에 넣어서 집계를 한다.

 

하지만 엑셀은 행x열에 한계가 있다.

1,048,576행x16,384열이 전부 차면 더 이상 값을 넣을 수 없다.

엑셀은 한계가 있다.

 

그래서 데이터 사이언티스트는 데이터프래임을 사용하기 시작했다.

왜냐? 데이터프래임에는 한계가 없기 때문이다.

데이터 프래임의 한계라면 메모리이다.

결국 메모리가 버텨주는한 데이터는 계속 넣을 수 있다.

 

그리고 이 데이터프래임을 정말 편하게 사용하게 해주는 도구가 있다.

그것이 바로 판다스(Pandas)다.

파이썬에서는 엑셀이 판다스가 되고, 시트가 데이터프래임이 된다.

판다스, Pandas

 

 

 

 

[ 판다스의 기능 찾기 ]

 

판다스(Pandas)에서 제공하는 도구들은 데이터를 처리할 때 강력하다.

판다스에 어떤 기능이 있을까는 고민하지 않아도 된다.

기능에 대해서 1부터 10까지 하나씩 배워도 다 까먹는다.

그렇기 때문에 내가 데이터를 어떻게 처리할까만을 생각하면 된다.

 

최고의 방법이고 단순한 방법으로

SQL로 데이터를 처리할 수 있을까를 생각하면 된다.

이 말은 검색할 때 힘을 발휘한다.

 

예를 들어 데이터프래임에서 SQL의 where not in 기능을 찾아보겠다.

그러면 아래와 같이 간단하게 검색이 된다.

검색 결과는 코드로 되어 있어서 아주 직관적이다.

데이터프래임과 SQL을 연관 지어서 검색하면 빠르게 찾을 수 있다.

판다스 데이터프래임의 기능 검색 방법

 

 

 

 

 

[ 궁극의 기술 apply와 lambda ]

apply를 사용하게 되면 컬럼끼리 값을 합거나 뺄 수 있다.

또한 조건별로 데이터를 처리할 수 도 있다.

 

For문을 돌려서 처리하면 되지 라고 생각할 수 있다.

1000만 건을 for문으로 처리한다고 생각해보자.

이번 생에는 끝나지 않을 수 도 있다.

 

하지만 apply는 dataframe을 빠르게 처리할 수 있는 알고리즘이 적용되었다.

또한 메모리에 올려서 속도를 Max로 올려준다.

평생 끝나지 않을 거 같은 처리가 apply로는 몇 분 만에 해결된다.

 

이런 궁극의 기술도 몇 가지 예시만 있으면 금세 사용 가능하다.

먼저 테스트 데이터프래임을 만들어 보자

import pandas as pd
import numpy as np
animal = pd.DataFrame(np.array([['사자', "1", "10", '어흥','010-1234-1234'], 
                            ['사자', "2", "20", '야옹','010-1234-4321'], 
                            ['늑대', "1", "30", '컹컹','010-4331-1234'], 
                            ['하마', "2", "40", '므허','010-1234-3567']]), 
                      columns=['종류', '반', '번호', '별명', "연락처"])
animal.head()

 

아래 두 가지 형태만 알아도 데이터를 만들어 가는데 큰 도움이 될 것이다.

 

#컬럼끼리 값 합치기

lambda x => x가 animal 데이터프래임을 대표한다.

 

x['반'] + '-' + x['번호'] => animal 데이터프래임의 반 컴럼과 번호 컬럼의 문자열을 "-"와 합친다.

 

animal['반-번호'] => 새로운 컬럼명("반-번호")에 문자열을 합친 걸 넣는다.

 

axis=1 => 1은 "컬럼끼리 계산 하겠다" 라고 이해하면 된다. 대부분 이걸 쓰게 될 것이다.

animal['반-번호'] = animal.apply(lambda x: x['반'] + '-' + x['번호'], axis=1)
animal.head()

apply 적용된 dataframe

#조건별로 컬럼들의 값 합치기

'자퇴' if x['별명'] == '어흥'  => animal 데이터프래임의 별명 컴럼이 "어흥"이면 자퇴로 적용한다.

 

else x['반'] + '-' + x['번호'] => "어흥" 외의 값은 animal 데이터프래임의 반 컴럼과 번호 컬럼의 문자열을 "-"와 합친다.

 

if가 있으면 반드시 else가 있어야 한다.

주의해서 적어 넣는다.

animal['반-번호'] = animal.apply(lambda x: '자퇴' if x['별명'] == '어흥' 
                              else x['반'] + '-' + x['번호'], axis=1)
animal.head()

apply if 를 적용한 dataframe