-
Data Engineering - DataFrame(pandas) 6-2Data Engineering 2020. 10. 12. 17:30
Pandas
데이터를 수집하고 정리하는데 최적화된 도구
- 오픈소스
판다스 자료구조 vs. 파이썬 기본 자료구조 list, dictionary
- 판다스는 시리즈(Series)와 데이터프레임(DataFrame)이라는 구조화된 데이터 형식을 제공
데이터 프레임이란?
- 2차원 배열 구조
- R 프로그램에서 유래
- 2차원은 열과 행으로 만들어지며, 각각의 열은 시리즈 객체
- 열과 행이 사용하는 주소는 각각 행 인덱스(row index)와 열 이름 (column name 또는 label)
- 열은 공통의 속성을 갖는 일련의 데이터
- 행은 개별 관측대상에 대한 다양한 속성 데이터들의 모음인 레코드 (record)
시리즈
- 시리즈는 데이터가 순차적으로 나열된 1차원 배열의 형태
- 인덱스Index와 데이터 값Value이 일대일 대응
- 키 Key와 값Value이 짝을 이루는 딕셔너리Dictionary와 비슷한 구조
시리즈 만들기
- 시리즈는 딕셔너리와 구조가 비슷하기 때문에
딕셔너리를 시리즈로 변 환하는 방법을 많이 사용
- 리스트를 시리즈로 변환하는 경우, 인덱스 구조를 이해하면 됨
1) 딕셔너리 -> 시리즈 변환
import pandas as pd dict_data = {'a':1, 'b':2, 'c':3} #dictionary -> series sr = pd.Series(dict_data)
2) 리스트 -> 시리즈 변환 : (default) 정수형 위치 인덱스
list_data =['2019-01-02', 3.14, 'ABC', 100, True] #list -> series sr = pd.Series(list_data)
※ 인덱스 구조
두 종류의 인덱스 표현
1. 정수형 위치 인덱스
2. 인덱스 이름 또는 인덱스 라벨
원소 선택
- 원소의 위치를 나타내는 인덱스를 이용하여 시리즈의 원소를 선택 vs. 리스트 인덱싱
- 대괄호 [ ] 에 두 가지 인덱스 모두 사용 가능
import pandas as pd dict_data = {'a':1, 'b':2, 'c':3} sr = pd.Series(dict_data) sr['b'] sr[1:2] sr['b':'c']
데이터 프레임 만들기
1) Dictionary 자료구조를 DataFrame 으로 변환하여 생성
- 딕셔너리의 key는 DataFrame의 열이름으로
-딕셔너리의 list로 된 value는 DataFrame의 열로
import pandas as pd #dictionary -> DataFrame Dict_data = {'name' : ['Jerry', 'Riah', 'Paul'], 'algol' : ['A', 'A+', 'B'], 'basic' : ['C', 'B', 'B+'], 'c++' : ['B+', 'C', 'C+'] } df = pd.DataFrame(dict_data)
2) 2차원 리스트 자료구조를 DataFrame 으로 변환하여 생성
- 생성자의 인자로 행 인덱스와 열 이름 설정 가능
index=[ ], columns=[ ]
import pandas as pd #2차원 List -> DataFrame list_data = [[15,'남','덕영중'], [17, '여','수리중'], [16, '여','연수중'] ] df = pd.DataFrame(list_data)
행/열 삭제
- df1 = df.drop( '예은‘ ) : df는 그대로, 삭제된 값 df1에 반환
- 인자1 : 행 인덱스, 열 이름 또는 리스트
- 인자2 : 행 선택 axis=0 (default) , 열 선택 axis=1
#list_data는 이전 예제 참조 df = pd.DataFrame(list_data, index=['준서', '예은', '길동'], columns=['나이', '성별', '학교']) #행 삭제 df1 = df.drop('예은') df2 = df.drop(['준서','길동']) #열 삭제 df5 = df.drop('성별', axis=1)
행 선택
loc 와 iloc 인덱서
- loc는 인덱스 명으로 선택
- iloc는 정수형 위치 인덱스로 선택
슬라이싱
Ex) iloc[3:7] : 정수형 위치 인덱서로, 3행부터 6행까지 선택 (7은 제외)
#df는 이전 예제 참조 #행선택 sr1 = df.loc['길동'] sr2 = df.iloc[0] #l2개이상의 행 list형태로 df1 = df.loc[['준서','길동']] df2 = df.iloc[[0,2]] #범위 slicing df3 = df.loc['예은':'길동'] df4 = df.iloc[0:2]
열 선택
- 데이터프레임의 열 데이터를 1개만 선택할 때는,
대괄호 [ ] 안에 열 이름 을 따옴표와 함께 입력
- 대괄호 안에 열 이름의 리스트를 입력하면
리스트의 원소인 열 모두 선 택하여 데이터프레임으로 반환
#df는 이전 예제 참조 #열선택 sr5 = df['나이'] #2개이상의 열 list형태로 df5 = df[['나이', '학교']]
원소 선택
- 데이터프레임의 행 인덱스와 열 이름을 [ 행 , 열 ] 형식의 2차원 좌표로 입력하여 원소 위치를 지정
- 원소 선택은 시리즈 및 데이터프레임 단위로 반환도 가능
#df는 이전 예제 참조 #원소선택 el1 = df.loc['예은','학교'] el2 = df.iloc[1, 2] #2개이상의 열 iist형태로 sr1 = df.loc['준서', ['나이', '학교']] #2개이상의 행,열 슬라이싱 df1 = df.loc['준서':'예은','나이':'학교']
행/열 추가
#df는 이전 예제 참조 df1 = df.copy() #열추가 df1['수학'] = 80 df1['과학'] = [90, 80, 70] #행추가 df1.loc['희수'] = [15, '남', '반포중', 100, 95] #기존행 복사 df1.loc['수연'] = df1.loc['예은'] #원소값 변경 df1.loc['예은','수학']=75 df1.iloc[1,4]=75 df1.loc['예은',['수학','과학']]=85, 90
※ 이전 Pandas 사용 자료 읽기 리뷰
데이터 읽기
1. pandas.read_csv( )
import pandas as pd df = pd.read_csv('data-text.csv', encoding='utf-8') df
2. pandas.read_json( )
import pandas as pd df = pd.read_json('data-text.json') # encoding : default is ‘utf-8’ df
데이터 저장 방법
1. dataframe.to_csv( )
import pandas as pd file_path = 'data-text.csv' df = pd.read_csv(file_path, encoding='utf-8') #iloc인덱서 & slicing df100 = df.iloc[:100] #csv write df100.to_csv('data-text100.csv')
2. dataframe.to_sql()
#1. DB 연결 con = sqlite3.connect("C:/Temp/sqlite3/test.db") # DataFrame 생성 예 data = {'name' : ['Jerry', 'Riah', 'Paul'], 'algol' : ['A', 'A+', 'B'], 'basic' : ['C', 'B', 'B+'], 'c++' : ['B+', 'C', 'C+'] } df = pd.DataFrame(data) #2. DB 저장 df.to_sql('score',con, if_exists='append', index=False) #3. DB 연결 종료 con.close()
'Data Engineering' 카테고리의 다른 글
Data Engineering - XML (0) 2020.09.28 Data Engineering - csv, json 읽기week4-1(3-2) (0) 2020.09.21 Data Engineering - 데이터 랭글링 전과정 이해(week3-1) (0) 2020.09.14 Anaconda 가상환경 설정하기 (0) 2020.09.09 데이터 엔지니어링이란? 2020-2 / 2주차-1 (0) 2020.09.07