Python_Pandas_02(DataFrame)
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