/*elice*/ 서포터즈 연재글 4차 - Pandas로 데이터 만져보기!

근자감 민아, 자신감의 근거 찾기!

안녕하세요, /*elice*/ 서포터즈 1기 민아입니다.
이번에는 텀이 길었던 만큼 평소보다 많은 내용을 공부하는 시간이었습니다.
하지만 그 모든 내용을 소개하긴 힘들 것 같아요.
그래서 이번에는 제가 유용하게 사용한 Pandas에 대해 간단히 소개해보려고 해요.


image

12월 20 - 21일에 거쳐 진행된 우정사업본부 주최의 빅데이터 해커톤에 참여하게 되었습니다.
물론 함께 참여한 친구들은 모두 초심자들이었고, 사용하는 언어도 제각각이었기에 다른 참여자들만큼 좋은 성과를 얻지는 못했지만, 무박2일동안 데이터 분석에 대한 많은 연습을 할 수 있는 기회가 되었습니다.
그 중에서 Python을 사용하는 저는 주로 Pandas를 이용하게 되었는데요, 깔끔하게 정리된 /*elice*/의 강의자료를 생각보다 많이 참고하게 되었습니다.

image 수업 링크: https://academy.elice.io/courses/450/info


Pandas는 구조화된 데이터를 효과적으로 처리하고 저장할 수 있도록 도와주는 라이브러리입니다.
특히, Pandas의 DataFrame은 행과 열을 이룬 데이터로, 실제 데이터를 다루기에 매우 유용했습니다.

DataFrame은 이와 같은 모양으로 생긴 자료형입니다.

image

1. 저장과 불러오기

Pandas는 엑셀에 맞는 자료를 불러오거나 저장하기 유용합니다.

import pandas as pd

# file 변수 안에 file.csv 파일을 불러오기
file = pd.read_csv('./file.csv')

# file 변수 안에 저장된 DataFrame을 file.csv로 저장하기
file.to_csv('./file.csv')

저는 주로 csv 파일을 사용했기 때문에 csv를 예시로 들어드렸지만, 위의 함수들에서 csvexcel로 바꾸면 .xlsx 파일을 읽고 작성할 수 있습니다.
그리고, 이렇게 불러온 데이터들은 모두 DataFrame 형태로 사용할 수 있습니다!
생각보다 너무 간단하지 않나요?


2. 정렬하기

DataFrame의 값을 정렬하는 것은 sort_values() 함수를 이용합니다.

import pandas as pd

df = pd.read_csv('./file.csv')

# col1을 기준으로 오름차순 정렬합니다.
df.sort_values('col1')
# col1을 기준으로 내림차순 정렬합니다.
df.sort_values('col1', ascending=False)
# col2를 기준으로 정렬하고 그 안에서 col1을 기준으로 정렬
df.sort_values(['col2', 'col1'])

위의 코드를 보기 쉽게 데이터로 살펴보겠습니다.

file.csv

image

sort_values(‘col1’)

image

col1의 값들이 오름차순으로 정렬되었습니다.

sort_values(‘col1’, ascending=False)

image

col1의 값들이 내림차순으로 정렬되었습니다.

sort_values([‘col2’, ‘col1’])

image

col2의 데이터가 오름차순으로 정렬되고, 중복되는 값 안에서는 col1의 데이터가 오름차순으로 정렬되었습니다.


3. groupby 함수

Pandas의 DataFrame에 적용할 수 있는 함수가 많이 있지만, 저는 그 중 groupby 함수를 가장 많이 사용했습니다.
그래서 마지막으로 groupby 함수를 소개하려고 합니다.

groupby 함수는 이름처럼 데이터를 그룹 단위로 집계하는 함수입니다.

df.groupby('col2')
# <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x00000197672B02E8>
df.groupby('col2').sum()  # col2가 같은 것들의 합
df.groupby(['col2', 'col1']).sum()  # col2, 1이 같은 것들의 합

df.groupby(‘col2’).sum()

image

DataFrame에 있는 값들을 col2를 기준으로 그룹지어 더한 결과가 반환됩니다.

df.groupby([‘col2’, ‘col1’]).sum()

image

DataFrame에 있는 값들을 col2를 기준으로 그룹짓고 그 뒤 col1로 그룹지어 더한 결과가 반환됩니다.


aggregate() 함수는 groupby를 통해서 집계를 한번에 계산해주는 함수입니다.

# import Numpy as np
df.groupby('col2').aggregate(['min', np.median, max])
df.groupby('col2').aggregate({'col1': 'min', 'col3': np.sum})

df.groupby(‘col2’).aggregate([‘min’, np.median, max])

image

col2를 기준으로 그룹을 묶고 그룹 내에서 aggregate에 넘겨진 기준에 따라 집계를 한 결과를 반환합니다.

df.groupby(‘col2’).aggregate({‘col1’: ‘min’, ‘col3’: np.sum})

image

col2를 기준으로 그룹을 묶고 col1은 min으로, col3은 np.sum으로 집계한 결과를 반환합니다.


만약 aggregate처럼 정해진 기준이 아니라 다른 기준을 통해 데이터를 집계/필터링 하기를 원한다면 filter() 혹은 apply() 를 사용할 수 있습니다.

def filter_by_mean(x):
  return x['col1'].mean() > 3
df.groupby('col2').mean()
df.groupby('col2').filter(filter_by_mean)

df.groupby('col2').aggregate([max, 'min'])
df.groupby('col2').apply(lambda x: x.max() - x.min())

df.groupby(‘col2’).mean()

image

df.groupby(‘col2’).filter(filter_by_mean)

image

col2를 기준으로 묶은 그룹을 filter_by_mean 함수를 기준으로 필터링 한 결과를 반환합니다.

df.groupby(‘col2’).aggregate([max, ‘min’])

image

df.groupby(‘col2’).apply(lambda x: x.max() - x.min())

image

col2를 기준으로 묶은 그룹에 apply를 통해 넘긴 lambda식을 적용해 집계한 결과를 반환합니다.


get_group() 함수를 이용하면 groupby()로 묶인 데이터에서 key값으로 데이터를 가져올 수 있습니다.

df.groupby('col2').get_group('A')

df.groupby(‘col2’).get_group(‘A’)

image

col2 항목에 ‘A’라는 값을 갖고 있는 데이터들만을 반환합니다.


이렇게 제가 유용하게 사용한 3개의 큰 흐름만을 간단히 소개해드렸습니다.
이정도만 보더라도 Pandas가 얼마나 유용한지 확 와닿는 것 같습니다.
하지만 이건 /*elice*/를 통해 학습한 내용 중 절반 정도 뿐이랍니다.
이번 기간은 데이터 처리를 위해 거의 필수적인 모듈인 Numpy, Pandas를 쉽고 간편하게 사용해볼 수 있는 기회가 되었습니다.
아직 데이터 시각화를 위한 모듈인 Matplotlib는 잘 사용하지 못하지만 이정도까지 데이터 전처리 연습을 할 수 있었다는 게 매우 만족스러웠습니다.


오늘을 끝으로 /*elice*/ 서포터즈 활동을 통한 연재글은 끝을 맺게 되었습니다.
이 활동을 통해 제가 정말 많이 성장했는지는 아직 알 수 없습니다.
하지만 적어도 Python 기초 문법과 자료구조 정도만 알고 바로 머신러닝 모델만 공부하느라 잘 연결되지 않던 부분들은 조금씩 연결이 되어가는 것 같습니다.
그리고 C언어로만 공부하던 알고리즘을 Python을 이용해 공부해보는 기회를 통해 Python을 사용하는 요령을 어느 정도 익히게 되었습니다.
무엇을 이루었냐고 묻는다면 이번 서포터즈 활동을 완주했다는 것과, 그 과정에서 얻게 된 새로운 연재의 기회, 그리고 빅데이터 해커톤에 참여를 했다는 결과를 얻었다고 생각합니다.

자신감 뿐이던 민아는 이제 적어도 Python에 있어서는 비전공자라는 게 믿기지 않는 실력이 되었다는 이야기를 듣고 있습니다.
저의 연재글과 함께 여러분도 한뼘 성장하는 시간이 되었다면 그것 또한 제가 얻게 된 새로운 결과가 될 수 있겠죠?
지금까지 /*elice*/ 서포터즈 1기 민아였습니다.
함께해주셔서 감사합니다!


이 글은 /*elice*/ 서포터즈 활동을 위해 작성되었습니다.
elice academy : https://academy.elice.io/explore
민아가 들은 수업이 궁금하다면?
Numpy, Pandas 데이터분석: https://academy.elice.io/courses/450/info

이 글은 elice gitbook과 블로그에서도 연재됩니다.
elice gitbook: https://elicesupporters.gitbook.io/support/