지난 포스팅에서는 Pandas, DataFrame, Series가 무엇인지 간략하게 살펴보고 이를 바탕으로 파일을 불러오는 것 까지 해보았습니다.
오늘은 Pyhton에서 DataFrame을 만들고 이를 저장하는 과정에 대해 알아볼것입니다.
3. Create DataFrame from your python code : Python에서 DataFrame 만들기
Python에서 DataFrame을 만드는 방법은 여러 방법이 있습니다. 딕셔너리를 이용하는 방법, OrderedDict 모듈을 이용해 만드는 방법, Pandas의 from_records를 이용하는 총 3가지 방법이 있습니다. 딕셔너리 중심으로 DataFrame을 만드는 이유는 아무래도 데이터라는 것이 각각의 정보가 아닌 서로 연관을 가지고 포함관계가 있기 때문이라 생각합니다. 단점이 있다면 검색이 어렵다는 게 흠이지만 실제로 학교에서 과제나 프로젝트를 할 때 리스트만큼 딕셔너리도 많이 이용해서 데이터를 만들거나 전 처리했기 때문에 DataFrame을 만들 때 딕셔너리를 기반으로 하면 더 좋지 않을까... 란 생각을 해보았습니다.
방법 1. 딕셔너리를 이용한 DataFrame
딕셔너리(Dictionary)는 '키'를 기반으로 값을 저장합니다. 그래서 리스트와는 다르게 가리키는 위치가 '인덱스'가 아닌 '키'라고 합니다. 이러한 딕셔너리를 바탕으로 DataFrame을 만들어 보겠습니다
test_dic = { "key1" : "value1" "key2" : 3 }
딕셔너리는 위와 같이 '키 : 값' 형태로 되어있습니다. 그럼 이제 딕셔너리를 이용해 DataFrame을 만들어 보겠습니다.
가장 먼저 데이터 정보를 담을 딕셔너리 리스트를 만듭니다. 리스트의 선언방식은 '변수 = []', 딕셔너리의 선언방식은 '변수={}'인 것을 잘 이용하면 가장 큰 리스트 안에 딕셔너리들을 담아냅니다. 마치 딕셔너리들이 하나의 '행'이 된다고 생각하면 될 것 같네요. 이렇게 해서 위에 friend_dic을 보면 한 사람의 이름, 나이, 직업을 각각의 딕셔너리에 담겨있는 것을 확인할 수 있습니다. 이렇게 만든 딕셔너리 리스트로 이제 DataFrame을 만들겠습니다.
df = pd.DataFrame(dictionary)
위에서 만들었던 friend_dic이라는 딕셔너리 리스트를 DataFrame class에 넣어주면 우리가 알고 있는 그 DataFrame이 만들어집니다. 과거에는 키의 순서가 보장되지 않아 조금 아쉬웠는데 언제부턴가가 리스트에 입력했던 딕셔너리의 키 순서 그대로 반영이 되어 DataFrame을 만들어 주는 것 같습니다.
※검색을 통해 알아봤더니 Python 3.6부터는 dict가 입력 순으로 정렬되었다고 합니다. 이유는 성능 때문이라고 합니다.
방법 2. Collections 모듈의 OrderedDict 클래스를 이용한 DataFrame
이번에 사용할 방법은 과거 dict()가 키의 순서를 보장하지 않아 이를 보완하고자 했던 방법입니다. 그래서 잘 쓰이진 않겠지만 그냥 이런 방법도 있구나~ 하면서 보면 될 것 같습니다. 그러나 무엇보다 dict()가 키의 순서를 보장하고 있음에도 OrderedDict가 있는 이유는 순서 정보까지 저장하기 때문에 입니다. 이 부분은 따로 포스팅해보겠습니다.
일단 OrderedDict를 사용하기 위해 모듈을 불러옵니다
from collections import OrderedDict
이제 OrderedDict 함수를 통해 순서가 있는 딕셔너리를 만들면 다음과 같은 형태를 갖습니다.
ordered_df = OrderedDict( [ ('key1', ['val1', 'val2', 'val3']), ('key2', ['val4', 'val5', 'val6']) ] ) pd.DataFrame(ordered_df)
이전에 dict()를 이용할 때 각 딕셔너리들이 행 정보를 담고 있었다면 여기서는 각각의 key는 컬럼명을 의미하고, 리스트를 이용하여 열정보를 담고 있습니다. 입력하는 방법이 dic와는 조금 다릅니다. 다음 과정은 위에서와 같이 Pandas의 DataFrame을 통해 DataFrame을 만들 수 있습니다.
위에서와 같이 예시를 들어 실행해 보면 다음과 같습니다.
방법 3. DataFrame.from_records 메서드를 사용한 DataFrame
DataFrame.from_records 메서드는 튜플의 리스트, 구조체 자료형을 사용하는 ndarray를 자료형을 입력으로 받는 메서드 입니다. 이 메서드 또한 DataFrame() 함수와 유사하게 작동합니다. 출력되는 DataFrame의 인덱스는 입력된 데이터 중 하나의 필드를 설정할 수 있습니다.
오늘은 리스트와 ndarray 중 리스트를 이용하여 DataFrame을 만들어 보겠습니다.
test_list = [ ['val1', 20], ['val2', 25] ] pd.DataFrame.from_records(test_list)
위 코드처럼 리스트 안에 리스트를 담는 형태의 데이터를 만들고, DataFrame.from_records() 메서드에 넣으면 DataFrame을 만들 수 있습니다.
각각의 방법을 이용할 때, 각 방법의 특징과, 그에 맞는 자료형을 쓰는 게 핵심입니다.
4.Write DataFrame To File : DataFrame 파일로 저장하기
DataFrame을 저장하는 방법에서의 핵심은 어떤 확장자로 저장할 것인가, 그리고 옵션입니다. 가장 대중적은 확장 파일인 csv 파일, excel 파일 외에도 html 또는 latex와 같은 파일로도 저장할 수 있습니다.
저장 가능한 다양한 확장자를 확인하려면 이전에 알려드렸던 tab키를 활용하면 쉽게 확인하실 수 있습니다.
dataFrame.to + tab
다음은 파일을 저장할 때 지정할 수 있는 옵션입니다. 가장 많이 이용하는 csv 파일로 저장한다고 가정한다 했을 때, 대표적으로 index, header, na_rep 옵션이 있습니다. 그럼 새로 DataFrame을 만들어 다양한 방법으로 저장해 비교해보겠습니다.
이 DataFrame은 현재 컬럼명이 있고, 특이하게 Jenny의 job은 'None'으로 되어있습니다. 이 부분을 기억해 두세요!
1) 디폴트
디폴트는 아무런 옵션 없이, 저장할 파일 이름만 지정하여 저장되는 형태입니다.
df.to_csv('file_name')
위 예시에서 제시했던 DataFrame을 'friends.csv'로 저장하여 확인해보면 인덱스 번호를 포함하여 저장했으며, 컬럼명 또한 반영되어 있고, None이 었던 제니의 job에는 큰 변화가 없습니다.
이를 통해 아무런 옵션을 지정하지 않으면 index = True, header = True 임을 알 수 있습니다.
2) index
index 옵션은 DataFrame의 인덱스 정보를 포함해 저장할지 여부를 묻는 옵션으로 디폴트 값은 True입니다. 그렇다면 만약 index가 False일 땐 어떤 형태로 저장되는지 확인해보겠습니다.
df.to_csv('file_name', index=False)
이전에 디폴트 옵션으로 저장했을 때 있던 인덱스 정보는 없이 저장되었음을 확인할 수 있습니다.
2) header
header옵션은 DataFrame의 컬럼명 정보를 저장할지 여부를 묻는 옵션으로 디폴트 값은 True입니다. 그렇다면 만약 ㅗheader 옵션이 False일 땐 어떤 형태로 저장되는지 확인해보겠습니다.
df.to_csv('file_name', header=False)
이전에 디폴트 옵션으로 저장했을 때 있던 인덱스 정보는 없이 저장되었음을 확인할 수 있습니다. jupyer lab에서도 csv파일을 확인할 수 있었지만 1열을 자동을 header로 인식하여 출력하여 엑셀에서 열어 확인해 보았습니다. 둘 다 확실히 것은 컬럼명을 제외하고 저장되었다는 것은 확인할 수 있었습니다.
3) na_rep
이 옵션은 위의 두 옵션과 달리 True/False 형이 아닌 알려지지 않은 값을 대신해 넣은 문자열을 지정하는 옵션입니다.
df.to_csv('file_name', na_rep='txt')
예시로 알려지지 않은 값을 대신할 문자열로 '-'를 지정해 보았습니다.
저장된 파일을 확인해보면 None값이 '-'로 대체되어 저장되었음을 확인할 수 있습니다.
이번 글에서는 파일을 부르는 대신 Pyhton에서 DataFrame을 만들고 이를 저장하는 것까지 해보았습니다. 다음 글에서는 DataFrame에서 행, 열을 중심으로 각각을 선택하고 필터링하는 방법에 대해 소개해드리겠습니다.
'Study > Python' 카테고리의 다른 글
[Python]Pandas basic 파이썬 판다스 기초 : 데이터 그룹 만들기, 중복 데이터 삭제 (0) | 2021.08.12 |
---|---|
[Python]Pandas basic 파이썬 판다스 기초 : 행,열 생성 및 수정하기 (1) | 2021.07.14 |
[Python]Pandas basic 파이썬 판다스 기초 : 행,열 삭제 (0) | 2021.06.30 |
[Python]Pandas Basic 파이썬 판다스 기본 : 데이터프레임 다루기 (0) | 2021.06.28 |
[Python] pandas basic: 파이썬 판다스 기본: 개념, 데이터 불러오기 (1) | 2021.06.21 |