[Python] Pandas-1
Pandas
오늘은 Pandas에 대하여 알아보겠습니다. Pandas는 ndarray(Numpy)를 기본 자료 구조로 사용하며 두 개의 또 다른 자료구조Series
와 DataFrame
를 이용합니다.
먼저 Pandas를 설치하고 시작하도록 하겠습니다. 하기 명령어를 터미널에서 입력하여 설치합니다.
$conda install pandas
설치가 완료되었다면 예제를 통하여 자세하게 알아보도록 하겠습니다.
Series
동일한 데이터 타입의 복수개의 성분으로 구성되는 자료구조 ( 1차원 )
import pandas as pd
import numpy as np
# ndarray
arr = np.array([-1,4,5,99], dtype=np.float64)
# print(arr)
# pandas의 Series부터 만들어 보아요!
s = pd.Series([-1,4,5,99], dtype=np.float64)
print(s)
'''
0 -1.0
1 4.0
2 5.0
3 99.0
'''
print(s.values) # [-1. 4. 5. 99.] ndarray
print(s.index) # RangeIndex(start=0, stop=4, step=1) RangeIndex객체로 만들어짐
print(s.dtype) # float64
# Series 생성 시 index를 별도로 지정할 수 있어요! => list, ndarray 로 지정할 수 있어요!
# 숫자 index는 기본으로 사용이 가능!!
s = pd.Series([-1, 8, 5, 10 ], dtype=np.float64, index=['c','b','a','k'])
print(s)
'''
c -1.0
b 8.0
a 5.0
k 10.0
dtype: float64
'''
print(s[0]) # -1.0
print(s['c']) # -1.0
# 그러면 만약 index를 우리가 새로 지정해서 사용할 때
# 같은 index가 있으면 어떻게 되나요??
s = pd.Series([-1, 8, 5, 10 ], dtype=np.float64, index=['c','b','c','k'])
print(s['c'])
'''
c -1.0
c 5.0
dtype: float64
'''
print(s['c'].values) # [-1. 5.]
# Series에서 Slicing 도 가능할까요??
print(s[1:3]) # Series로 결과 return
'''
b 8.0
c 5.0
dtype: float64
'''
print(s['b':'k']) # 앞 뒤 범위 둘다 포함
'''
dtype: float64
b 8.0
c 5.0
k 10.0
dtype: float64
'''
# Boolean Indexing
print(s[s%2 == 0]) # 짝수만 출력!!
'''
b 8.0
k 10.0
'''
# Fancy Indexing
print(s[[0,2,3]])
'''
c -1.0
c 5.0
k 10.0
'''
# Numpy에서 했던 여러가지 작업들이 그대로 사용될 수 있어요 !!
print(s.sum()) # 22.0
s = pd.Series([1,2,3,4])
print(s)
# 새로운 데이터를 Series에 추가하려면 ??
s[4] = 100
print(s)
s[6] = 100 # 5를 제외해도 6이 새로 생김
print(s)
'''
0 1
1 2
2 3
3 4
4 100
6 100
'''
# Series에서 특정 index를 삭제하려면 ??
s = s.drop(2)
print(s)
'''
0 1
1 2
3 4
4 100
6 100
dtype: int64
'''
# python의 dictionary를 이용해서 Series를 만들 수 있어요 !!
# dictionary의 key가 index가 되요!!
import numpy as np
import pandas as pd
my_dict = {'서울' : 1000, '부산' : 2000 , '제주' : 3000}
s =pd.Series(my_dict)
print(s)
'''
서울 1000
부산 2000
제주 3000
dtype: int64
'''
s.name = '지역별 가격 데이터!!' # Name: 지역별 가격 데이터!! // 시리즈의 이름을 부여가 가능
s.index.name = '지역명'
print(s)
'''
지역명
서울 1000
부산 2000
제주 3000
Name: 지역별 가격 데이터!!, dtype: int64
'''
DataFrame
엑셀에서 Table 과 같은 개념입니다. Database의 Table 이며 여러개의 Series로 구성됩니다. (2차원)
# Pandas DataFrame 생성 !!
# python의 dictionary를 가지고 만들어요!!
# dictionary 로 DataFrame을 생성할때 데이터의 개수가 맞지 않으면 Error발생
# dictionary의 key가 DataFrame의 column으로 들어가게 됩니다.
# DataFrame은 Series의 집합으로 구성됩니다!! (각각의 column이 Series)
import numpy as np
import pandas as pd
# dictionary
data = {'names' : ['홍길동', '아이유', '김연아', '강감찬', '이순신'],
'year' : [2015, 2019, 2020, 2013, 2017],
'points' : [3.5, 1.5, 2.0, 3.4, 4.0]
}
# DataFrame을 생성
df = pd.DataFrame(data)
# Data Frame 을 출력할떄는 display()를 이용해서 출력하느 것이 좋아요!
display(df)
'''
names year points
0 홍길동 2015 3.5
1 아이유 2019 1.5
2 김연아 2020 2.0
3 강감찬 2013 3.4
4 이순신 2017 4.0
'''
# 기억해야 하는 속성을 알아보아요!!
print(df.shape) # tuple 로 표현되구요! (5,3)
print(df.size) # 15 모든 요소의 개수
print(df.ndim) # 차원
# DataFrame의 index, values, columns
import numpy as np
import pandas as pd
# dictionary
data = {'names' : ['홍길동', '아이유', '김연아', '강감찬', '이순신'],
'year' : [2015, 2019, 2020, 2013, 2017],
'points' : [3.5, 1.5, 2.0, 3.4, 4.0]
}
df = pd.DataFrame(data)
display(df)
print(df.index) # RangeIndex(start=0, stop=5, step=1)
print(df.columns) # Index(['names', 'year', 'points'], dtype='object')
print(df.values) # 2차원 ndarray
'''
[['홍길동' 2015 3.5]
['아이유' 2019 1.5]
['김연아' 2020 2.0]
['강감찬' 2013 3.4]
['이순신' 2017 4.0]]
'''
df.index.name = '학번'
df.columns.name = '학생정보'
display(df)
'''
학생정보 names year points
학번
0 홍길동 2015 3.5
1 아이유 2019 1.5
2 김연아 2020 2.0
3 강감찬 2013 3.4
4 이순신 2017 4.0
'''
DataFrame 을 생성하는 다양한 방법
1. CSV 파일을 이용해서 DataFrame을 생성
CSV 파일을 하나 만들어서 DataFrame을 생성해 보아요!! Student.csv를 다운 받아서 사용해보겠습니다.
import pandas as pd
df = pd.read_csv('./data/student.csv')
display(df)
2. Database를 이용해서 DataFrame을 생성
MySQL을 사용하여 데이터를 구축한 후 pandas의 DataFrame으로 읽어오도록 하겠습니다.
SQL 파일은 _BookTableDump.sql 을 다운받아서 사용해보도록 하겠습니다.
# 여러가지 DBMS제품들이 있어요
# 데이터베이스??
# 데이터베이스는 일반적으로 정제된, 연관성이 있는 자료의 집합.
#우리는 이런 데이터베이스를 활용하고 싶어요! CS분야에서는 데이터베이스가 파일에 저장되어 있어요
#이런 데이터베이스를 다루기 위한 프로그램이 필요해요!
# 이런 프로그램들을 DBMS(DataBase Management System) 라고해요!
# Oracle, Cybase, DB2, Informix, MySQL, SQLite, etc...
# MySQL을 가지고 데이터베이스를 구축한 후 이 데이터를 pandas의 DataFrame으로 가져올꺼에요!
# MySQL이라는 DBMS로 데이터베이스를 생성해서 데이터베이스를 구축해요!!
# 그 안에 있는 데이터를 추축해서 DataFrame으로 생성!
# 사용할 MySQL버전은 5.6 버전을 사용할 꺼에요!
# 데이터를 정제하고 전처리를 하는데 pandas가 이용될 꺼에요!!
# 1. MySQL 5.6버전을 다운로드한 후 바탕화면에 압축을 풀어요!
# 2. bin폴더로 이동한 후./mysqld를 실행해서 MYSQL DMBS Sever를 시작해요!
# 3. MySQL Server를 실행시켰기 때문에 MySQL console에 들어갈 수 있어요!
# 4. MySQL Server를 정상적으로 중지하려면 새로운 command창을 띄워요! 다시 해당 bin 폴더로 이동
# ./mysqladmin -u root shutdown
# 5. MySQL Server를 다시 기동시킨 후
# 6. MySQL 시스템에 접속해요! => command창을 열어서 다음의 명령어를 ./mysql -u root
# 7. 새로운 사용자를 생성해요!!
# => create user data identified by "data";
# 8. 새로운 사용자를 하나 더 생성해야 합니다.
# => create user data@localhost identified by "data";
# 9. 데이터베이스를 생성해야 해요!!
# => create database library;
# 10. 생성한 데이터베이스(library)에 대한 사용권한을 새롭게 생성한 data 사용자에게 부여
# => grant all privileges on library.* to data;
# => grant all privileges on library.* to data@localhost;
# 11. 지금까지 작업한 권한부여작업을 flush
# => flush privileges;
# 12. 작업이 완료되었으니 console 을 종료
# => exit;
# 13. 제공된 파일을 이용해서 실제 사용할 데이터베이스를 구축해보아요!!
# 14. 파일을 복사한 다음 다음의 명령어를 도스창에서 실행!
# mysql -u data -p library < _BookTableDump.sql
# mysql -u '유저명' -p '라이브러리명' < _BookTableDump.sql
## 데이터 베이스 구축이 끝났으니... pandas로 데이터베이스에 접속해서 데이터를 가져다가 DataFrame으로 만들어 보아요!
# 그런데 특별한 기능을 사용하고 있어요. python으로 MySQL database를 사용하는 기능을 하려고해요
# 이 기능을 하기위한 package(module)이 필요해요! 이 모듈을 설치해야 해요! > pip install pymysql
import pymysql.cursors
import pandas as pd
# pymysql이라는 module을 이용해서 데이터 베이스에 연결
# mysql -u data -p library < _BookTableDump.sql
# mysql -u '유저명' -p '라이브러리명' < _BookTableDump.sql
conn = pymysql.connect(host= 'localhost',
user = 'data', # '유저명'
password = 'data',
db='library', # '라이브러리명'
charset='utf8')
# 데이터베이스에 접속되면 SQL문을 실행시켜서 Database로 부터
# 데이터를 가져온 후 이놈을 DataFrame으로 생성
sql = 'select btitle, bauthor, bprice from book'
df = pd.read_sql(sql, con = conn)
display(df)
Leave a comment