본문 바로가기

파이썬/Pandas (데이터 가공 라이브러리)

Pandas 기초 및 활용

# 학습내용
- 판다스 인덱싱
- loc와 iloc
- 데이터에서 조건별 선택

import pandas as pd
reviews = pd.read_csv("./lib/input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
# pd.set_option('max_rows', 100)
print(reviews)

# 파이썬 객체에서 속성으로 엑세스를 하는 방법에서 book이라는 객체가 있고
# title이라는 속성이 있다면 이 속성에 접근하기 위해 book.title 이런식으로 접근하는 것을 뜻합니다.
# Pandas DF의 열에 접근하는 방식도 이와 매우 유사 합니다.
# reviews객체에 country컬럼에 액세스를 하기 위해서는 아래와 같이 입력 할 수 있습니다.
print(reviews.country)

# 예전에 딕셔너리에서 특정값을 접근 시 인덱싱 ([])을 사용 하였습니다.
# 이 방법 역시 DF에서 열을 찾는 작업에 활용 할 수 있습니다.
reviews['country']

# 특정 열의 값을 뽑아내고 싶은 경우
reviews['country'][0]
print(reviews['country'][0])

reviews.iloc[0]
print(reviews.iloc[0])

# 아래 코드를 실행하세요
# 행은 처음부터 끝까지,
# 열은 첫번째 열만 가져오라는 의미입니다.
reviews.iloc[:, 0]
print(reviews.iloc[:, 0])

# : 연산자는 모든 것을 뜻하지만 다른 범위와 결함될 경우 값의 범위를 나타 냅니다.
# 예를들어 첫 번째, 두 번째, 세번째 행에서 country열을 선탱하려면 다음과 같습니다.
reviews.iloc[:3, 0]
print(reviews.iloc[:3, 0])

# 또는두번째 세번째열만을 선택하려면 아래와 같습니다.
reviews.iloc[1:3,0]
print(reviews.iloc[1:3,0])

# 범위 대신 리스트를 사용해 표현을 할 수도 있습니다.
reviews.iloc[[0,1,2], 0]
print(reviews.iloc[[0,1,2], 0])

# 음수 사용 가능
# 음수는 끝 값부터 출력함
reviews.iloc[-5:]
print(reviews.iloc[-5:])

# 라벨기반 선택 인덱스 값을 기반으로 데이터를 추출한다.
reviews.loc[0, 'country']
print(reviews.loc[0, 'country'])

# loc와 iloc의 차이 : loc = 라벨 값으로 데이터 접근 iloc = 인덱싱 값으로 데이터에 접근

#데이터를 연속적인 묶음이 아닌 의미있는 인덱스의 합으로 구성하고자 한다면 loc를 사용해 구성하는 것이 더 좋습니다.
#loc를 사용한 예를 들어보겠습니다.
value_01 = reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]
print(value_01)
print('출력 완료')

aa = value_02 = reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]
print(aa)
print('출력 완료_02')

# iloc는 파이썬의 stdlib 인덱싱을 사용하기에 첫 번째 요소가 포함되고 마지막 요소가 제외된다.
print(reviews.loc[0:2])
print(reviews.iloc[0:2])

#df.iloc[0:3]는 3가지의 항목을 리턴하고,
#df.loc[0:3]는 4가지를 반환 합니다.

# 인덱스 조작하기
# set_index를 통해 타이틀을 수정하면 인덱스가 0,1,2,3,4로 시작되된 항목이 타이틀 항목으로 변경된것을 확인 할 수 있다.
reviews.set_index("title")
print(reviews.set_index("title"))

# 조건별 선택 = 데이터에 조건을 걸기
# 이탈리아에서 생산되는 평균 이상의 와인에 대해서 검색하기
reviews.country == 'Italy'
print(reviews.country == 'Italy')

# loc 함수를 사용하여 조건에 맞는 데이터만 선택하기
reviews.loc[reviews.country == 'Italy']
print(reviews.loc[reviews.country == 'Italy'])

# 위의 검색으로 필터하여 약 2만건의 데이터를 추출 하였다.
# 여기서 평군이상의 와인 품질을 선택하기 위해서 90 이라는 조건을 연결해보자.
# 조건을 연결하는 것은 and를 의미하는 &를 사용하면 된다.
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
# 검색 결과를 확인하면 약 6648건이 검색된 것을 확인 할 수 있다.
print(reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)])

# 여기서 and를 의미하는 & 문자 외에도 or를 의미하는 | 문자도 활용이 가능하다.
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]
print(reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)])

# pandas에는 몇가지 조건부 선택기가 내장되어 있다.
# 1. isin은 데이터 값 리스트에서 포함된 값을 선택 한다.
# 예를들면 아래처럼 이탈리아나 프랑스에서만 와인을 선택하는 방법이다.
reviews.loc[reviews.country.isin(['Italy', 'France'])]
print(reviews.loc[reviews.country.isin(['Italy', 'France'])])

# 2. 두번째는 isnull(notnull) 입니다.
# 데이터 내의 결측치를 파악하는 것에 유용하게 사용되며 사용시 NaN을 체크 합니다.
# 예를 들어 데이터 세트에서 가격표가 없는 와인을 필터링 하려면 다음과 같습니다.
reviews.loc[reviews.price.notnull()]
print(reviews.loc[reviews.price.notnull()])

# 데이터 할당
# DF에서 새로운 데이터를 할당하는것은 쉽습니다.
reviews['critic'] = 'everyone'
reviews['critic']
print(reviews['critic'])

# 고정 상수가 아닌 반복 표현도 가능 합니다.
reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']
print (reviews['index_backwards'])