데이터 분석/파이썬

판다스를 이용한 데이터 정제

pluralmajor 2020. 6. 17. 21:46

오늘은 판다스(pandas) 라이브러리를 이용한 데이터 정제를 반드시 정리할 것이다.

 

우선

 

판다스란?:

파이썬에서 사용하는 데이터 분석 라이브러리로 행과 열로 이루어진 데이터 객체를 만들어서 다룰 수 있으며 안정적으로 큰 용량의 데이터를 처리하는데 유용하게 쓰인다.

 

판다스는 처리 속도가 빠른 편은 아니지만 많은 사람들이 이용하고 있는 라이브러리이다. 속도가 느림에도 애용하는 이유는 다음과 같다.

 

1. 러닝커브가 낮다.

2. python universe에 속한다.

3. 디버깅하기 편하다.

4. 빠른 시각화가 가능하다.

 

판다스의 기본 개념으로는 Series와 DataFrame이 있는데 이는 위에서 말한 행과 열로 이루어진 데이터 객체들의 명칭이다. 판다스를 다루기 위해서는 이에 대한 이해가 불가결 하므로 설명을 하고 넘어가도록 하겠다.

 

-Series:

딕셔너리 같은 형태로 1:1 대응을 이루며 index와 values를 가진다.

 

 

출력시에 위와 같은 형태로 출력되고 지정해준 숫자가 아닌 앞에 나와있는 0-3의 숫자는 index에 해당된다.

index 값 역시 다음과 같이 선언해줌으로써 변경할 수 있다.

 

 

 

딕셔너리 처럼 1:1 대응을 이룰 수 있음을 알 수 있다. 단지 모양만 닮아있는 것이 아니라, 딕셔너리로 선언해 줄수도 있다.

 

ex) data = { 'A' : 4, 'B' : 5, 'C' : 6, 'D': 7}

     ser = pd.Series(data)

 

또 series에는 name과 index name을 붙여줄 수 있는데, 방법은 아주 간단하므로 적어놓고 넘어가겠다.

 

ex) ser.name = 'PhyJun'

     ser.index.name = 'Grade'

 

위를 출력하면 dtype에 series의 name이 출력되고 index 위에 Grade가 표시된다.

 

 

 

 

-DataFrame:

DataFrame은 Series보다 한 단계 높은 개념으로 이해하면 쉽다. 실제로 DataFrame의 사용빈도가 Series보다 높고 활용도도 높다.

 

Series와 마찬가지로 행과 열의 구조를 가지지만, 선언에서부터 Series보다 알아보기 쉬운 형태이다.

 

 

 

 

 

 

기본 데이터를 딕셔너리형으로 작성해준 후에 출력은 행렬으로 만들어준다.

 

Series와 마찬가지로 index와 name을 선언해줄 수 있으며, DataFrame 안에 존재하지 않는 값에 대해서는 누락값(NaN)으로 표시된다.

 

DataFrame에서는 각 열을 선택해서 조작할 수 있으며, 추가적으로 Series를 넣어줄 수 있다.

 

 

 

여기서 내가 해주고 싶은 말은, 위의 방법으로 indexing을 해주는 것은 pandas 내에 존재하는 수많은 방법중 하나이다. 

 

물론 위의 방법으로도 원하는 결과를 불러올 수 있지만, 내가 추천하는 방법은 아래의 방법이다.

 

.loc함수 / .iloc함수

 

기본적으로 같은 함수열에 속하지만, loc은  단위 번호를 기준으로, iloc은 index 단위 번호를 기준으로 추출할 때 사용된다.

 

 

 

 

(일일이 출력하고 찍기 귀찮아서 주피터 노트북을 썼다..)

 

loc을 사용해서 단일 열을 출력할 시에는 Series형태로 출력이 된다. 

 

iloc의 경우는 index번호를 사용해주면 된다.

 

ex) df.iloc[3:5, 0:2]

 

loc과 iloc은 기준이 되는 것이 뚜렷하고 출력을 할 때에 가독성이 좋기 때문에 애용하는 편이다.

 

loc과 iloc을 구분하기 쉽게 말하자면, loc은 이름을 기준으로 선택을 하고, iloc은 위치를 기준으로 선택을 한다고 생각하면 편하다.

 

 


자.. 기나긴 서론을 지나서 본론으로 들어가보자.

 

우리가 판다스를 하는 이유는 데이터를 정제하기 위해서다.

 

데이터정제란 또 무엇인가?

 

데이터를 다루다보면 의미없는 값이나 null(빈값)이 나오기도 한다. 데이터 정제는 이런 값들을 걸러내거나 의미있는 값으로 변환하기 위한 과정이다.

 


 

데이터를 확인하기 위한 매서드는 다음과 같다.

변수 = pd.read_csv('파일 위치')  
.head()   # 맨 앞의 자료 가져오기(기본적으로 상위 5개의 목록을 가져오지만 괄호 안의 숫자에 따라 정해진다.)
.tail() 
.sort_index() # 행과 열 이름을 정렬해서 나타낸다.
정렬은 axis를 이용한다. 
axis = 0 은 index 기준 ( = axis)
axis = 1 은 column 기준
.describe()  # 간단한 통계를 보여준다. 컬럼별로 count, mean, std, min, 25%, 50%, 75%, max들의 정보를 알 수 있다.

 

이외에도 .values .columns .index .dtype과 같은 속성들도 많다.

 


 

이제부터 데이터를 다루는 과정을 배우게 될 것이다.

 

이 과정을 하기 위해서는 준비된 파일이 tsv파일이 필요한데 이는 내가 공부할 때 파일을 제공받은 것을 기준으로 진행될 것이고 첨부도 해 놓겠다.

 

data.zip
0.10MB

 

우선 데이터를 추출하는 과정을 예시로 한번 보자.

 

 

gapminder라는 파일을 불러와서 country라는 이름을 가진 index를 country_df에 저장하고, head함수를 통해서 상위 country의 상위 5개 항목을 추출해 낼 것이다.

 

subset 변수에는 3개의 index를 가져와서 head를 적용해보겠다.

 

 

 

 

원하는 것 처럼 출력이 잘 된것을 볼 수 있다.

 

배운 것을 조금 써서 예시로 들면,

 

 

 

range가 헷갈릴 수 있으므로 살짝 설명을 하면, range(a, b, c) => a부터 c 숫자만큼의 간격으로 b-1까지의 정수를 반환한다.

따라서 range(0, 6, 2)는 2만큼의 간격을 두고 5까지 정수를 반환하니, 0, 2, 4를 반환한다.

 

=> iloc(mydf.iloc[10:20, [0, 2, 4]]) 와 같다고 볼 수 있는것이다.

 

출력결과는 사진에 담기 좀 많아서 직접해보는 것을 추천하고 넘어간다!

 


데이터를 분류하다보면, 비슷하지만 따로 구분되어 있는 데이터들이 있는데 이건 groupby 매서드를 통해서 묶어줄 수 있다.

 

 

 

groupby를 사용해서 year과 continent를 기준으로 데이터를 묶었다. 

 

출력을 원하는 값은 lifeExp와 gdpPercap 각각의 평균이다.

 

출력을 하게 된다면 아마 각 나라별 연도마다의 lE와 gPc을 구해줄 것이다.

 

 

 

데이터량이 많아서 짜르긴 했지만 위에서 언급한대로 잘 출력되었다. 

 

평균 이외의 것들도 구할 수 있는데 그건 아래의 표를 참고해서 작성해보도록 하자.

함수

설명

Sum()

합계

Count()

개수

Median()

중간값

Quantile([0.1, 0.9])

분위값

Min()

최소값

Max()

최대값

Mean()

평균

Var()

각 객체의 분산 값

Std()

각 객체의 표준편차

Nunique()

유니크의 개수


데이터 정제에 관한 내용은 상당히 많고 어렵기 때문에 한번에 정리하고자 했던건 내 욕심이라는 것을 깨달았다..

 

아직 정리해야할 내용이 많지만 한번에 너무 많이 정리하면 사실 정리의 의미를 잃으므로 이까지 정리하고 다음에 또 정리해서 올리도록 하겠다.