본문 바로가기

AI

[Python Data Manipulation] Pandas 사용법

캐글 미니코스에서 판다스를 공부해보았다

UCI 데이터 사이언스 과목 청강할때 그때그때 필요한 내용을 공부하면서 사용해본적은 있지만

개념을 정확히 모르고 사용하니 쓸때마다 알아가는 느낌이 아니라 매번 검색해야해서 답답했다

캐글 코스를 들으면 금방 정리할 수 있을 것 같아 듣고 나중에 보기 위한 내용정리!

 

판다스는 이렇게 import 해서 사용한다

 

1
import pandas as pd
cs

 

판다스를 사용하기 위해서는 가장 중요한 두개의 object가 있는데 바로 DataFrame과 Series이다

먼저 DataFrame은 테이블이라고 생각할 수 있다

이 테이블은 index를 0,1,2로 기본적으로 만들지만 따로 index를 지정해줄수도 있다

 

Series는 DataFrame과는 다르게 value들의 수열이라고 볼 수 있다

그저 데이터의 list! 

DataFrame처럼 index는 지정해줄 수 있지만 테이블은 아니다

 

역시 사용해보면서 익히는 것이 좋을 것 같아 exercise 이외의 데이터를 가지고 연습해보았다

이번에 사용해본 데이터는 리그오브레전드 게임 데이터ㅋㅋㅋ

롤을 하지는 않지만 주변에 롤에 환장하는 사람이 많아서 자연스레 관심이 갔다

 

판다스에서 csv 파일을 사용하고 싶으면 이렇게 이용할 수 있다

 

1
2
3
lol_data = pd.read_csv('/kaggle/input/league-of-legends-diamond-ranked-games-10-min/high_diamond_ranked_10min.csv')
lol_data.shape
lol_data.head()
cs

 

read_csv 함수를 이용해 데이터를 저장할 수 있다

이때 데이터는 shape를 통해 본다면 데이터가 몇개 있는지와 feature의 개수를 파악할 수 있다

head로 몇개만 살펴보자면 

 

 

이런 느낌!

 

이제 이 데이터를 가지고 요리조리 사용해보았다

먼저 selection은 두가지로 접근할 수 있다.

 

1. index based selection

iloc 함수를 사용한다

row-first, col-second 헷갈리지 않게 주의하기

 

1
2
3
# index based selection
lol_data.iloc[1]
lol_data.iloc[:,1]
cs

 

이렇게 행과 열을 select 해서 Series로 얻어낼 수 있다

 

2. label based selection

loc 함수를 사용한다

index based selection과 같이 사용할 수도 있다

 

1
2
# label based selection
lol_data.loc[[1,2,3],'blueWins']
cs

 

set index 함수를 통해 gameID를 index로 만들어보았다

 

 

label based selection과 함께 쓰면 좋다

 

1
lol_data.set_index('gameId').loc[:,'blueWins']
cs

 

이렇게 사용하면 index로 gameId를 갖는 blueWins의 값들을 Series로 얻어올 수 있다

 

 

다음으로는 conditional selection을 살펴보았다

 

1
lol_data.blueWins == 0
cs

 

blueWins가 0인지 아닌지에 대한 정보를 참 거짓으로 담고 있는 Series로 만들어 사용할 수 있다

 

1
lol_data[(lol_data.blueWins == 1& (lol_data.blueFirstBlood == 1)]
cs

 

이런식으로 블루팀이 이겼으면서 퍼블을 먹은 경우의 데이터만 DataFrame으로 받아올 수 있다

 

 

isna 함수와 함께 사용한다면 데이터가 비어있는 행을 제외하고 사용할 수도 있다

데이터가 비어 있는 행은 isna 함수를 이용해 제외시키는 것 이외에도 fillna 함수를 이용해 특정 값을 채워주거나 채워준 값을 replace 함수를 이용해 변환시켜 사용할 수도 있다

 

다음은 summary function들을 살펴보았다

직관적인 이름에 쉬운 사용법을 가지고 있어 금방 손에 익었다

 

1
2
3
4
lol_data.describe()
lol_data.blueKills.unique()
lol_data.blueKills.value_counts()
lol_data.blueKills.mean()
cs

 

이름만 봐도 결과값이 쉽게 예상된다

 

약간 낯선 개념이었던 map

map을 공부할때는 게임 플레이 데이터 말고 챔피언 데이터를 사용하였다

 

 

 

map은 이런식으로 사용할 수 있다

 

1
2
speed_of_attack_mean = champion_data.speed_of_attack.mean()
newdata = champion_data.speed_of_attack.map(lambda p : p - speed_of_attack_mean)
cs

 

newdata에는 Series 값이 담기는데 이 때 전체 DataFrame을 얻고 싶다면 map 함수 대신 apply 함수를 사용할 수 있다

 

1
2
3
4
5
def remean_speed_of_attack(row):
    row.speed_of_attack = row.speed_of_attack - speed_of_attack_mean
    return row
 
champion_data.apply(remean_speed_of_attack,axis='columns')
cs

 

주의할 점은 두 함수 모두 return 값만 바뀌는 것이지 원래 데이터 값을 바꾸는 것은 아니다

 

group by는 sql에서 다뤘던 것과 비슷한 느낌이었다

 

1
2
champion_data.groupby('origin').origin.count()
champion_data.groupby('origin').health.min()
cs

 

처음은 value_counts와 똑같은 역할을 하는 함수 구조이다

두번째 줄은 각 그룹에서 health가 가장 작은 값들을 나타내어준다

 

groupby로 묶여진 DataFrame은 기존의 DataFrame처럼 apply 함수도 사용 가능하다

또한 agg 함수를 이용해 다양한 함수들을 동시에 사용할 수도 있다

 

1
champion_data.groupby('origin').health.agg([len,min,max])
cs

 

마지막으로 sorting!

 

1
champion_data.sort_values(by='attack',ascending=False)
cs

 

이렇게 한줄만 봐도 무슨 뜻인지 바로 알 수 있을 것 같다

attack이 큰 순서대로 정렬하여 DataFrame을 반환시켜주는 함수이다

ascending은 true가 default 값이다

 

실제 데이터로 여러 함수를 반복적으로 연습해보니 pandas를 어떻게 써야 할지 감이 조금 오는 것 같다

얼른 데이터를 필요한 모양으로 만들어 모델을 만드는 데 사용해보고 싶다