Run The Bridge

(Kaggle) Pandas (15) 본문

Python/Pandas

(Kaggle) Pandas (15)

anfrhrl5555 2020. 12. 22. 18:05
728x90
반응형

학과 졸업 프로젝트로 머신러닝을 다루어 보았는데, 생각보다 매력적이고 이때 가지하던 코딩과는 조금 다른 개념이라서 나 자신이 흥미를 가지기에 충분하였다.

 

그래서 종강도 하였겠다 시간도 많고 모니터도 더블 모니터로 준비해두었기에 올겨울 긴 시간 동안에는 머신러닝 & 딥러닝의 세계로 빠져들 예정이다.

 

먼저 첫 번째로 Pandas에 관련된 내용은 많이 게시하였지만, 시간이 지나면 까먹는 게 기정사실이기 때문에 Youtube를 통한 복습을 먼저 할 예정이다.

 

사용할 csv파일은 kaggle에서 지원하는 wine Reivews이다.

wine Reviews

ㆍ먼저 Pandas packageimport 시킨다.

import pandas as pd

 

wine Reviews csv를 불러온다.

reviews = pd.read_csv('../input/wine-reviews/winemag-data-130k-v2.csv', index_col=0)

 

ㆍReviews의 형태를 다음과 같다.

reviews.head()

wine Review.head()

ㆍiloc 와 loc 사용법

reviews.iloc[0]

reviews.iloc[:, 0]

reviews.iloc[0:3, 0]

reviews.iloc[-5:]

reviews.iloc[0] → 첫번째 Row에 관한 모든 Column들을 Series 형식으로 보여준다. (0번째 인덱스만 보여준다.)

reviews.iloc[: , 0] → 모든 Row에 관한 0번째 Column들을 보여준다.(country만 보여준다.)

 

reviews.iloc[0:3, 0] → [0, 1, 2]에 관한 Row들에 관해 0번째 Column들을 보여준다(Country에서 1 ~ 3번째까지 보여준다)

reviews.iloc[-5:] → 끝에서부터5개를보여준다.

 

reviews.loc[0, 'country']

reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]

reviews.loc[0, 'country'] 0번째 Row에서 country관련 내용만 보여준다.

 

reviews.loc[:. ['taster_name', 'taster_twitter_handle', 'points']] →모든 Row에 대해 다음 3개에 대해서만 보여준다.

ㆍMap과 apply 사용법

 

points의 평균을 reviews_points_mean에 담는다.

reviews_points_mean = reviews['points'].mean()

 

 

points컬럼에 lambda를 사용하여서 (p라는 변수 - point의 평균값)을 적용한다.

reviews['points'].map(lambda p: p-reviews_points_mean)

 

또는 이러한 방식으로도 가능하다.

 

map을 apply으로 바꾼 것이 전부이다.

reviews['points'].apply(lambda p: p-reviews_points_mean)

 

Q. 어 그러면 Map or Apply 하나만 쓰면 되는 거 아니에요?

 

A. 물론 나도 그렇게 생각했지만

map은 Series 타입에서만 사용이 가능하고,

apply은 DataFrame에서 복수 개의 컬럼에서 사용이 가능하다.

위에서 봤듯이 map은 points라는 하나의 Series에서만 사용한 것을 알 수 있다.

 

ㆍGroupby와 Sorting

 

points를 groupby으로 묶고, 개수를 센다.

reviews.groupby('points').points.count()

 

winery Column을 그룹으로 묶고, lambda를 써서 reviews['title']에 첫번째 행마다 적용시켜주었다.

reviews.groupby('winery').apply(lambda df: df.title.iloc[0])

 

country와 provincec를 기준으로 그룹을 묶고, 길이를 출력한다.

* agg는 내가 생각하기엔 aggregation 인 것 같다.

countries_reviewed = reviews.groupby(['country','province']).description.agg([len])

옆에 Row index값이 보이지않는다 이럴땐 다음과 같은 코드로 해결할 수 있다.

countries_reviewed.reset_index()

 

또한 오름차순으로 정렬도 가능하다.

countries_reviewed.sort_values(by='len')  # 오름차순

 

내림차순은 끝에 ascending=False를 붙여주면 가능하다.

countries_reviewed.sort_values(by='len', ascending=False)  # 내림차순

 

ㆍData Types and Missing Values

 

price의 type을 확인할 수 있다.

reviews['price'].dtype

float64

하지만 나는 type을 확인할 때 부분말고 전체적으로 확인하기 때문에 info()를 사용한다.

reviews.info()

 

Column의 Type변환은 다음과 같이 astype()으로 바꾸어준다.

reviews['points'] = reviews['points'].astype('float64')

 

전체 csv에서 null 값(NaN) 값 개수 세기

reviews.isnull().sum()

 

region_2에 대한 null값을 채우는 방법: fillna

reviews['region_2'] = reviews['region_2'].fillna("Unknown")

Unknown을 쓴 것은 이러한 방법으로 채우면 된다 라는 가이드 라인이다

 

실제로는 Unknown 이렇게 쓰지 않고, 평균값, 기타 다른 Column들을 참조해서 유추한 다음에 알맞은 값을 채워 넣는다.

 

 

ㆍRenaming and Combining

 

Column의 이름을 바꾸는 방법

reviews.rename(columns={'points':'score'})

여기서부터는 새로운 csv파일을 불러온다. 

 

kaggle에서 Add data부분에 youtube라고 친 다음 가장 상단에 있는 Dataset를 추가하면 된다.

canadian_youtube = pd.read_csv('../input/youtube-new/CAvideos.csv')
british_youtube = pd.read_csv('../input/youtube-new/GBvideos.csv')
canadian_youtube.shape

canadian_youtube의   Col, Row

 

british_youtube.shape

british_youtube의     Col, Row

 

두 개의 csv를 합치기: concat를 써준다.(위, 아래로 합치기)

pd.concat([canadian_youtube, british_youtube])

근데 이러한 방법으로 합치면, canadian_youtube의 40881개가 먼저 앞에 있고, 그 뒤로 british_youtube가 합쳐진다.

 

즉, 섞이지 않는다는 말이다.

 

 

또 다른 방법으로는 join을 쓰는 법이 있다.(좌, 우로 합치기)

left = canadian_youtube.set_index(['title', 'trending_date'])
right = british_youtube.set_index(['title', 'trending_date'])

left.join(right, lsuffix='_CAN', rsuffix='_UK')

 

left를 기준으로 right를 붙이는데 lsuffix(왼쪽 csv에는 _CAN을 붙이고), rsuffix(오른쪽 csv에는 _UK를 붙인다.)

 

 

일단 여기까지가 Kaggle에서 지원해주는 6가지 Lesson이다. 

 

물론 더 많은 방법과 쉽게하는 법이 있겠지만 실제로 데이터를 분석하면서 터득하는것이 더 익숙해지기 쉽다.

 

감사합니다. Thank you!

728x90
반응형

'Python > Pandas' 카테고리의 다른 글

Pandas 기초(14)  (0) 2020.09.08
Pandas 기초(13)  (0) 2020.09.08
Pandas 기초(12)  (0) 2020.09.08
Pandas 기초(11)  (0) 2020.09.08
Pandas 기초(10)  (0) 2020.09.07
Comments