DATA ANALYSIS/TIL

[Day21] 데이터 핸들링(4)

yel1nk 2023. 5. 25. 18:38

Pandas

DataFrame

인덱스 설정

# 1. 데이터 프레임의 속성값에 직접 입력 
df = pd.DataFrame(np.arange(9).reshape(3, 3))
df.index = ['a', 'b', 'c']

df2

# 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

데이터 형식

  1. 정형 데이터 : Excel, csv, txt
  2. 반정형 데이터 : XML, HTML
  3. 비정형 데이터 : 이미지, 한글(.hwp)

정형 데이터

Excel

  • read_excel
  • to_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

  • read_table
  • to_csv
# 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)

사용할 열 선택

  • usecols=['1열', '2열']
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()

'DATA ANALYSIS > TIL' 카테고리의 다른 글

[Day23] EDA(1)  (0) 2023.05.30
[Day22] 데이터 핸들링(5)  (0) 2023.05.27
[Day20] 데이터 핸들링(3)  (0) 2023.05.24
[Day19] 데이터 핸들링(2)  (0) 2023.05.24
[Day18] 데이터 핸들링(1)  (0) 2023.05.23