Data_Analysis_Track_33/Python

Python_Pandas_02(DataFrame)

lsc99 2023. 9. 13. 15:07

powershell에서 conda 가상환경 활성화 (한번만 실행하면 됨)

- window power shell을 관리자권한으로 실행한다.

- 콘다 파워쉘 초기화

conda init powershell

- 파워쉘 권한 변경(파워쉘에서만 입력가능. 관리자 모드로 실행)

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

- 활성화

conda activate 이름


DataFrame(데이터프레임)

 

1. DataFrame 개요


- 표(table-행렬) 를 다루는 Pandas의 타입.
    Database의 Table이나 Excel의 표와 동일한 역할을 한다.
- 분석할 데이터를 가지는 판다스의 가장 핵심적인 클래스이다.
- 행(row)와 열(column) 으로 구성되 있다.
- 각 행과 각 열은 식별자를 가지며 Series와 같이 두가지 종류가 있다.
    순번
        양수, 음수 index 두가지를 가진다.
        컬럼도 내부적으로는 순번으로 관리되지만 우리가 조회할 때 사용할 수는 없다.
    이름
        명시적으로 지정한 행과 열의 이름을 말한다.
        행의 이름은 index name 이라고 하고 열의 이름은 column name이라고 한다.
        index name과 column name은 중복될 수 있다.
        명시적으로 지정하지 않으면 양수 순번이 index, column 이름으로 설정된다.
- 하나의 행과 하나의 열은 Series로 구성된다.
- DataFrame 객체는 직접 데이터를 넣어 생성하거나 데이터 셋을 파일(csv, 엑셀, DB 등)로 부터 읽어와 생성한다.

 

2. DataFrame 생성
2.1. 직접 생성

pd.DataFrame(data [, index=None, columns=None])
- data
    DataFrame을 구성할 값을 설정
        Series, List, ndarray를 담은 2차원 배열
        열이름을 key로 컬럼의 값 value로 하는 딕셔너리(사전)
- index
    index명으로 사용할 값 배열로 설정
- columns
   컬럼명으로 사용할 값 배열로 설정

 

import pandas as pd

# dictionary를 이용
data = {
    "id" : ['id-1', 'id-2', 'id-3', 'id-4', 'id-5'],
    "국어" : [100, 80, 90, 70, 80],
    "영어" : [80, 90, 75, 80, 60]
}
# key(컬럼명):value(1차원자료구조.컬럼의 값들) - 각 value의 원소 개수는 동일
# index 이름 : 따로 지정하지 않으면(index=[index이름들]) 양수 index가 이름이 된다.
grade = pd.DataFrame(data)
grade

2차원 구조

# 리스트(튜플)을 이용해 생성
data2 = [
    [61, 72, 83],
    [100, 90, 70],
    [80, 60, 40],
    [50, 100, 80]
]
# 2차원 구조의 리스트를 생성해서 DataFrame()에 전달
grade2 = pd.DataFrame(data2, columns=['국어', '영어', '수학'],# colunmns name 지정
                             index=['id-1','id-2','id-3','id-4'])
grade2

2.2. DataFrame의 객체를 파일에 저장
- DataFrame객체는 다양한 형식의 파일로 저장할 수 있다.
- 기본구문 : DataFrame객체.to_파일타입()

DataFrame객체.to_파일타입()

2.2.1. CSV 파일로 저장

DataFrame객체.to_csv(파일경로,sep=',', index=True, header=True)

* csv (comma separate value)
- 표(table)을 text파일에 작성하는 형식
- 한행에 한개의 데이터를 입력
- 속성값들을 ','로 구분

import os
# 저장파일 저장할 디렉토리 생성
os.makedirs('saved_data', exist_ok=False)

index, header를 이용하여 다른 형태의 csv파일들로 저장

# dataframe을 csv 파일로 저장. 파일명.csv
grade.to_csv("saved_data/grade.csv")

grade.to_csv("saved_data/grade2.csv", index=False) # index name은 저장하지 않기.(자동증가값일 경우 저장하지 않는다.)

grade.to_csv("saved_data/grade3.csv", index=False, header=False) # index name과 컬럼명을 저장하지 않는다.

2.2.2. 엑셀로 저장
DataFrame객체.to_excel(파일경로, index=True, header=True)

# excel 파일로 저장/읽기
# openpyxl 설치 (xlsx 형식), xlwt, xlrd (xls 형식)
!pip install openpyxl

index, header를 이용하여 다른 형태의 엑셀 파일들로 저장

# grade.to_excel("saved_data/grade.xlsx")
# grade.to_excel("saved_data/grade.xlsx", index=False)
grade.to_excel("saved_data/grade.xlsx", index=False, header=False)

2.2.3. 기타 형식

# pickle
grade.to_pickle('saved_data/grade.pkl')

# HTML 파일 -> html 파일안에 <table> 태그로 구성.
grade.to_html('saved_data/grade.html', index=False)

2.3. 파일로 부터 데이터셋을 읽어와 생성하기
2.3.1. csv 파일 등 텍스트 파일로 부터 읽어와 생성
pd.read_csv(파일경로, sep=',', header, index_col, na_values)

# index이름, column이름 모두 저장된 csv 파일

# csv파일의 첫행 -> headeer(컬럼명)
# index이름은 따로 읽지 않음. (첫 열을 데이터로 읽는다.)
# index이름으로 양수 index를 사용.

grade_r1 = pd.read_csv('saved_data/grade.csv', index_col=0) # 0번 컬럼을 index이름으로 사용
grade_r1

header는 있고 index name은 없는 csv

# header는 있고 index name은 없는 csv
grade_r2 = pd.read_csv('saved_data/grade2.csv', index_col="id") # id컬럼을 index 이름으로 사용
grade_r2

header가 없는 csv

# header가 없는 csv
# grade_r3 = pd.read_csv('saved_data/grade3.csv') # 첫행이 header가 됨
grade_r3 = pd.read_csv('saved_data/grade3.csv',
                        header=None, # header가 없다
                        names=['ID','국어','영어'] # 컬럼명을 명시
                      )
grade_r3

값의 구분자를 tab으로 설정,  grade4.csv에서 ,대신 tab으로 구분자 설정한 뒤에 실행하기

# 값의 구분자가 ','가 아닌경우(tab)
# grade4.csv에서 ,대신 tab으로 구분자 설정
grade_r5 = pd.read_csv("saved_data/grade4.csv", sep = "\t")

grade_r5

na_values를 이용하여 결측치로 처리할 문자열 지정

 - grade5.csv 파일의 값의 몇개를 '없음' 값으로 변경하고 실행하기

grade_r6 = pd.read_csv('saved_data/grade5.csv', na_values='없음')# na_values=['없음', 'id-1'])

grade_r6

column별로 결측치의 합계 계산

# column별로 결측치의 합계 계산
grade_r6.isnull().sum()

2.3.2. 엑셀파일 읽기

grade_xl = pd.read_excel('saved_data/grade.xlsx', header = None, names = ['id','국어','영어'])
grade_xl

2.3.3. 기타(pickle)

grade_pkl = pd.read_pickle('saved_data/grade.pkl')
grade_pkl

HTML

# read_html() -> lxml 라이브러리 설치
!pip install lxml

값들의 type 확인

grade_html = pd.read_html('saved_data/grade.html')
print(type(grade_html))
print(len(grade_html))
# html 문서안에 테이블들을 DataFrame을 읽은뒤 리스트로 묶어서 반환.

리스트 0번 인덱스에 모든 값이 입력되어 있는 것을 확인할 수 있다.

grade_html[0]

DBMS에서 table을 조회(select)한 결과를 DataFrame에 담기
- read_sql("select문", connection)

 

# UserWarning이 출력이 안되도록 처리
import warnings
warnings.filterwarnings("ignore")

emp_df, dept_df, result_df 값 확인을 위한 입력 sql 구문에 들어갈 값과 테이블들 확인하기

import pymysql
import pandas as pd

conn = pymysql.connect(host='localhost', port=3306, user="playdata", password='1111', db='hr_join')
emp_df = pd.read_sql("select * from emp", conn)
dept_df = pd.read_sql("select dept_name, loc from dept", conn)
join_sql = "select e.emp_id, e.emp_name, d.dept_name \
            from emp e left join dept d on e.dept_id = d.dept_id \
            where e.salary > 5000"
result_df = pd.read_sql(join_sql, conn)

구문에 맞는 값들 출력되는지 확인

# 값 확인
result_df
emp_df
dept_df