Pandas
DataFrame
인덱스 설정
# 1. 데이터 프레임의 속성값에 직접 입력
df = pd.DataFrame(np.arange(9).reshape(3, 3))
df.index = ['a', 'b', 'c']
# 2. 내부 컬럼(열) 이용
df2 = pd.DataFrame([
['a', 0, 1, 2],
['b', 3, 4, 5],
['c', 6, 7, 8]])
df2.set_index(0, inplace=True)
# drop=True (인덱스로 만든 열을 기존 데이터프레임에서 지울 것인지)
# append=False (기존 인덱스를 삭제할 것인지)
# inplace=False (원본 객체를 변경할 것인지)
# 3. 데이터 프레임의 컬럼을 재설정 -> 원본 데이터 유지
df2.reset_index()
# drop=False (인덱스로 만든 열을 기존 데이터프레임에서 지울 것인지)
# inplace=False (기본 인덱스를 삭제할 것인지)
MBTI 실습
# MBTI 분포 알아보기
mbti = [
'ISTJ','INFJ','ISTJ','ESTP','ENTP','ISFP','ISTJ','INFJ','ISTJ','ESTJ',
'ENFJ','INFJ','ENFP','ESFP','ENFJ','INTJ','INTP','ISTP','ISFJ','ISTJ',
'INTP','ISFJ','ESTJ','ISFP','ENFP','ENTJ','ISTP','ISTP','ENFJ','ENFP',
'ESTJ','ENTP','ISFP','ENTP','ESFP','ISFJ','ISTJ','ENTJ','ENFJ','ISFP',
'ENFJ','ENFP','ISFJ','ISFJ','ENFP','ESTJ','ENTJ'
]
ds_mbti = pd.DataFrame(mbti)
mbti_i = ds_mbti[ds_mbti[0].str.contains('I')]
mbti_i.describe()
# MBTI 궁합 알아보기
df_mbti = pd.DataFrame([
[4, 4, 4, 5, 4, 5, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1], # INFP
[4, 4, 5, 4, 5, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1], # ENFP
[4, 5, 4, 4, 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1], # INFJ
[5, 4, 4, 4, 4, 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1], # ENFJ
[4, 5, 4, 4, 4, 4, 4, 5, 3, 3, 3, 3, 2, 2, 2, 2], # INTJ
[5, 4, 4, 4, 4, 4, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2], # ENTJ
[4, 4, 4, 4, 4, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 5], # INTP
[4, 4, 5, 4, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2], # ENTP
[1, 1, 1, 5, 3, 3, 3, 3, 2, 2, 2, 2, 4, 5, 4, 5], # ISFP
[1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 5, 4, 5, 4], # ESFP
[1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 4, 5, 4, 5], # ISTP
[1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 5, 4, 4, 4], # ESTP
[1, 1, 1, 1, 2, 3, 2, 2, 3, 5, 3, 5, 4, 4, 4, 4], # ISFJ
[1, 1, 1, 1, 2, 3, 2, 2, 5, 3, 5, 3, 4, 4, 4, 4], # ESFJ
[1, 1, 1, 1, 2, 3, 2, 2, 3, 5, 3, 3, 4, 4, 4, 4], # ISTJ
[1, 1, 1, 1, 2, 3, 5, 2, 5, 3, 5, 3, 4, 4, 4, 4] # ESTJ
],
columns = ['INFP', 'ENFP', 'INFJ', 'ENFJ', 'INTJ', 'ENTJ', 'INTP', 'ENTP',
'ISFP', 'ESFP', 'ISTP', 'ESTP', 'ISFJ', 'ESFJ', 'ISTJ', 'ESTJ'],
index = ['INFP', 'ENFP', 'INFJ', 'ENFJ', 'INTJ', 'ENTJ', 'INTP', 'ENTP',
'ISFP', 'ESFP', 'ISTP', 'ESTP', 'ISFJ', 'ESFJ', 'ISTJ', 'ESTJ'])
df_mbti.loc['INFP', 'ENTP'] # 4
데이터 형식
정형 데이터 : Excel, csv, txt
반정형 데이터 : XML, HTML
비정형 데이터 : 이미지, 한글(.hwp)
정형 데이터
Excel
# 엑셀 파일 불러오기
df_excel = pd.read_excel('rawData_sheetplus.xlsx')
# 엑셀 파일 시트별로 불러오기
df_excel_sheet1 = pd.read_excel('rawData_sheetplus.xlsx', sheet_name='Sheet1') # 첫번째 시트 가져오기
df_excel_sheet2 = pd.read_excel('rawData_sheetplus.xlsx',
sheet_name=[0, 'Sheet2']) # 시트를 선택해서 가져오기
df_excel_sheet3 = pd.read_excel('rawData_sheetplus.xlsx',
sheet_name=None) # 모든 시트 가져오기
# 엑셀 파일 작성하기 - 새로운 컬럼(열) 추가
df_excel['손실'] = [10000, 20000, 30000, 40000, 50000, 60000]
# 엑셀 파일 내보내기
df_excel.to_excel('exit.xlsx')
df_excel.to_excel('exit.xlsx', sheet_name='first') # 시트 이름 지정하기
csv
read_csv
to_csv
오류 주의
encoding : utf-8, cp949, euc-kr
sep : 구분자를 입력 (',' - csv, '\s' - ssv, '\t' - tsv)
# csv 파일 불러오기
csv = pd.read_csv('/content/sample_data/california_housing_test.csv')
# csv 파일 내보내기
csv.to_csv('csv_test.csv')
txt
# txt 파일 불러오기
txt = pd.read_table('raw.txt') # txt 파일이지만 그 안에 내용을 보면 csv, tsv, ssv 로 되어있는 경우 많음
# txt 파일 내보내기
txt.to_csv('exit_txt.txt')
파일 공통 속성
header(열 이름) 설정
header=None : 헤더를 내 값 안에서 설정하고 싶지 않을 때
names=['1열', '2열'] : 새롭게 값을 할당시켜줌
excel_header = pd.read_excel('rawData_sheetplus.xlsx', header=0) # default
excel_header = pd.read_excel('rawData_sheetplus.xlsx', header=None)
excel_header = pd.read_excel('rawData_sheetplus.xlsx',
names=['연차', '연도', '매출', '순이익', '직원수'])
index(행 이름) 설정
index_col=None : 인덱스 없이 불러올 때 (불러온 이후에 인덱스를 지정해주고 싶을 때)
excel_index = pd.read_excel('rawData_sheetplus.xlsx', index_col='연차')
excel_index = pd.read_excel('rawData_sheetplus.xlsx', index_col=None)
사용할 열 선택
excel_cols = pd.read_excel('rawData_sheetplus.xlsx', usecols=['연차', '매출'])
제한할 행 선택
skiprows=n : 상단에서부터 n행 스킵
skiprows=[n, m] : n번째, m번째 행만 제외
skipfooter=n : 하단에서부터 n행 스킵
# 지울 행을 지정해서 그 행을 제외하고 가져오기
excel_rows = pd.read_excel('rawData_sheetplus.xlsx', skiprows=3, header=None)
excel_rows = pd.read_excel('rawData_sheetplus.xlsx', skiprows=[1, 2, 3], header=0)
excel_rows = pd.read_excel('rawData_sheetplus.xlsx', skipfooter=3, header=None)
반정형 데이터
JSON
JavaScript Object Notation
{ } 중괄호
{
'name': 'data',
'age': 1
}
# 파일 불러오기
shop = pd.read_json('data.json') # default : utf-8, cp949(windows 생성된 파일)
shop2 = pd.read_json('https://test.api.weniv.co.kr/mall') # 웹 상의 json 파일을 불러올 때
# 파일 수정하기 - drop으로 특정 열 삭제
shop = shop.drop(['thumbnailImg', 'detailInfoImage'], axis=1)
# 파일 내보내기
shop.to_json('json_.json')
XML
eXtensible Markup Language
XML -> 데이터 전송
HTML과 유사 -> 화면 구성
<person>
<name>data</name>
<age>1</age>
</person>
# <element></element> 요소
# <element 속성='값'></element>
# <element>'값'</element>
# 파일 불러오기
xml = pd.read_xml('raw_data.xml')
# 파일 내보내기
xml.to_xml('write.xml')
HTML
HyperText Markup Language
<태그></태그>
화면에 보여줄 때
<html>
<head></head>
<body></body>
<foot></foot>
</html>
# 파일 불러오기
html = pd.read_html('https://paullab.co.kr/stock.html')
stock = html[3]
# 파일 내보내기
stock.to_html('stock.html')
비정형 데이터
이미지
Pillow : 이미지 인식 라이브러리
MatPlotlib : 이미지 출력 라이브러리
!pip install Pillow
!pip install Matplotlib
from PIL import Image
import matplotlib.pyplot as plt
gary = Image.open('thumbnailImg.jpg')
gray = gary.convert('L') # 흑백 처리
import numpy as np
pixel = np.array(gary)
print(pixel.shape)
# (510, 510, 3) # 3 == RGB 컬러 수
plt.imshow(pixel) # 이미지 출력
plt.imshow(pixel[::-1]) # 상하 반전
plt.imshow(pixel[:, ::-1]) # 좌우 반전
plt.imshow(pixel[270:470, 190:370])
# RGB 색상 사용 분포도
plt.hist(pixel.ravel(), 256, [0, 256]) # ravel 평면화
plt.show()
plt.imshow(pixel[:, :, 1]) # RGB 1 값만 사용
# 이미지 불러왔을 때
print(gary.filename) # thumbnailImg.jpg
print(gary.format) # JPEG
print(gary.size) # (510, 510)
print(gary.mode) # RGB
print(gary.width) # 510
print(gary.height) # 510
# Pillow로 이미지 자르기
cropped_gary = gary.crop([150, 250, 400, 500])
cropped_gary.show()
from PIL import ImageFilter
# BLUR, CONTOUR 꼭 기억하기 -> 왜 사용하는가?
# BLUR 블러 - 흐리게 하기
blur_gary = gary.filter(ImageFilter.BLUR)
blur_gary.show() # 배열은 imshow()
# CONTOUR 컨투어 - 윤곽만 따오기
contour_gary = gary.filter(ImageFilter.CONTOUR)
contour_gary.show()