도찐개찐
[Python] 판다스(pandas) 본문
Python Pandas
Pyrhon으로 데이터분석을 접해본다면 Python Pandas는 절대로 빠질 수 없는 모듈입니다. 모든 데이터 처리가 Pandas의 Dataframe과 Series로 이루어지기 때문에 데이터분석을 하고 싶다면 꼭 알아두어야할 모듈입니다. 오로지 데이터 분석 뿐만 아니라 다른 사람들이 만들어 놓은 모듈에서 데이터를 Dataframe으로 주는 경우도 많기 때문에 어쩌면 Python 사용자라면 필수로 알고 넘어가야하는 부분이라고 생각합니다.
Python은 자료구조가 없는게 장점이자 단점인 언어라고 하는데... Python에서 다루는 자료형이 다른 언어들과는 달리, 제약이 많이 없고 자유로워서 다른 언어를 사용하던 분들에게 혼동을 줄수도 있지만, 새로운 방식이기 때문에 혁신적으로 바라볼 수도 있다고 생각합니다. 제 개인적인 생각으로는 자바나 다른 언어에서 사용하는 Map, Array 등등 이런 자료구조를 읽기 편하게 합쳐놓은게 Python Pandas의 강점이라고 해야할까요?
누락된 데이터를 유연하게 처리할 수 있거나, 마치 엑셀의 시트를 하나의 데이터 타입으로 만들어 놓은 느낌입니다. 그래서 오늘은 Python Pandas에서 DataFrame과 Series를 생성하고 데이터를 읽는 내용을 다뤄볼까 합니다. Dataframe을 생성하거나 읽는 방법이 워낙 다양해서... 하나의 글에 전체적으로 정리하면 조금 더 쉽게 Python Pandas 모듈의 Dataframe을 접근할 수 있지 않을까 하는 생각으로 실습을 진행해 보겠습니다.
import pandas as pd
Python Pandas는 Anaconda를 통해서 Python을 설치했다면 기본적으로 모듈이 설치되었고 없다면 pip를 통해서 설치해주어야합니다.
관례적으로 pd라는 이름으로 선언합니다.
Series
Series는 테이블 형식의 데이터로 봤을때 하나의 레코드 즉, 행 값으로 생각하면 됩니다.
-Series 생성
s1 = pd.Series([5000,30000,20000,15000])
Series와 Dataframe을 갖고 개발을 할때 정말 햇갈리는 부분이 있어요. Series는 행 값인데 출력은 세로로 되죠?
그리고 index 값으로 0 부터 순차적으로 인덱싱되는게 마치 Series 하나를 만들었는데 하나의 테이블로 보입니다. Series는 행 데이터라는 것을 명심하고 개발을 해야합니다.
s1 = pd.Series({
'2020-03-03' : 5000,
'2020-03-04' : 30000,
'2020-03-05' : 20000,
'2020-03-06' : 15000,
})
dictionary 형식으로로 index을 설정하면서 동시에 생성도 가능합니다.
--Series index & names 따로 지정
s1.index = ('2020-03-03','2020-03-04','2020-03-05', '2020-03-06')
s1.index.name = 'dates'
s1.name = 'durian'
Series에 index 부분은 각 데이터에 대한 열 속성입니다.
index의 name은 확인용으로 index의 의미를 확인하기 위해 지정해주고
Series 전체의 name은 하나의 행 데이터이기 때문에 해당 행을 대표하는 값입니다.
나중에 Dataframe에 삽입할때 name 속성은 필수로 요구됩니다.
해당 Series를 보면 durian의 각 날짜별 가격이라는 것을 알 수 있습니다.
--Series index & names함께 생성
s1 = pd.Series([5000,30000,20000,15000],
index=['2020-03-03','2020-03-04','2020-03-05', '2020-03-06'],
name='durian')
s1.index.name = 'dates'
index_name 값은 생성 인자로 받지 않아 따로 넣어줬습니다.
-Series 읽기
Series 읽기 작업은 위의 생성된 s1 Series를 갖고 실습하겠습니다.
--Series 순서 index로 읽기
s1[0]
Series는 일차 배열 형식의 행 데이터이므로 숫자 형태의 index로 받아올 수 있습니다.
단, 만약 indexing 작업을 텍스트가 아닌 숫자로 했을 경우, 해당 숫자 내의 index에서만 호출이 가능합니다.
이번 예제 에서는 각각 날짜를 사용해서 indexing을 해줬기 때문에 '0'으로 호출이 가능했습니다.
--Series index 이름으로 읽기
s1['2020-03-03']
마찬가지로 배열형식으로 읽을 수 있습니다.
만약, index가 숫자가 보함되지 않은 단어형태로 되어있으면
s1.word
'.'과 index로 설정한 명칭으로 호출할 수 있습니다.
s1[['2020-03-03','2020-03-04']]
배열 행태로 2개이상의 index를 호출하면 Series 타입으로 값을 줍니다.
slicing작업을 통해 부를 수 있습니다.
Dataframe
Dataframe은 Series들의 집합이라고 생각하시면 됩니다.
여러개의 Series(행)이 모여 하나의 테이블형식의 데이터를 생성할 수 있습니다.
-Dataframe 생성
df = pd.DataFrame(
[
[4000,20000,10000],
[5000,8000,11000],
[6000,9000,12000]
],
)
index 값과 column 값 없이 생성하게 되면 숫자형태로 0 부터 자동으로 매겨집니다. Dataframe을 제대로 사용하려면 index와 column 값을 넣어서 생성을 하도록 하겠습니다.
df = pd.DataFrame({
"2020-03-03" : [4000,5000,6000],
"2020-03-04" : [20000,8000,9000],
"2020-03-05" :[10000,11000,12000]
}, index=['apple','bannana','cherry']
)
dictionary 형태로 데이터를 넣어주는 방법이 있습니다. dictionary 형태로 값을 넣어주면, key 값이 각 column이 되고 value 값이 값이 됩니다. index를 안 넣어주면 숫자형태로 되니 원하는 형태로 index 값을 넣어봤습니다.
--Dataframe index & column 따로 넣기
df = pd.DataFrame(
[
[4000,20000,10000],
[5000,8000,11000],
[6000,9000,12000]
],
)
df.index = [['apple','bannana','cherry']]
df.columns = [['2020-03-03','2020-03-04','2020-03-05']];
Dataframe을 생성하는데도 index와 column을 따로따로 설정해주는 방법이 있습니다.
--Dataframe index & column 함께 생성
df = pd.DataFrame(
[
[4000,20000,10000],
[5000,8000,11000],
[6000,9000,12000]
],
index=['apple','bannana','cherry'],
columns=['2020-03-03','2020-03-04','2020-03-05']
)
index와 column을 따로 넣어준 것처럼 안에다 인자로 처리해주는 방법이 있습니다.
--Dataframe Series로 생성
s1 = pd.Series(
[4000,20000,10000],
index = ['2020-03-03', '2020-03-04', '2020-03-05'],
name='apple')
s2 = pd.Series(
[5000,8000,11000],
index = ['2020-03-03', '2020-03-04', '2020-03-05'],
name='bannana')
s3 = pd.Series(
[6000,9000,12000],
index = ['2020-03-03', '2020-03-04', '2020-03-05'],
name='cherry')
df = pd.DataFrame([s1,s2,s3])
위에서 설명했듯이 Dataframe은 Series들로 구성된 테이블형태의 구조라고 했습니다. 3개의 Series를 만들어서 하나의 Dataframe안에 넣어 만들었습니다. 이전에는 Series의 index나 name 그리고 Dataframe의 index와 column이 많이 햇갈렸을 수도 있지만, 위 예제를 잘 보면 두개의 구분과 이해하는데 많은 도움이 될거라고 생각합니다.
Dataframe 생성과는 거리가 조금 있지만, 더 확실한 이해를 위해 해당 Dataframe 안에 Series 데이터를 하나 더 넣어보는 것을 해보겠습니다.
s4 = pd.Series(
[5000,30000,20000,15000],
index=['2020-03-03','2020-03-04','2020-03-05', '2020-03-06'],
name='durian'
)
df.append(s4)
durian이라는 데이터를 넣었습니다. Series의 name값이 Dataframe의 index로 사용되는데 이번에는 3개가 아닌 4개의 데이터를 넣어봤습니다. 다른 개발 언어라면 에러가발생하고 막 그랬을텐데, 파이썬의 장점이자 단점?으로 다른 값은 NaN으로 처리가되고 에러는 발생하지 않습니다. 이렇게 데이터까지 하나 더 추가해보니까 확실히 Series와 Dataframe의 구조가 이해되는 것 같습니다.
-Dataframe 읽기
이번에는 Dataframe의 값을 읽어보는 실습을 진행해보겠습니다.
Dataframe 읽는 방법은 너무나도 다양해서 Dataframe 정보 읽기, 행 읽기, 열 읽기, 행 숫자 index 읽기, 복합 읽기 이렇게 5가지로 나눠서 봐야할것 같습니다.
이번 글에서는 이부분이 제일 중요한 부분이기도 합니다.
--Dataframe 정보 읽기
df.index
df.columns
df.values
df.describe()
각각 Dataframe의 index, column, 값, 요약에 대한 결과를 볼 수 있습니다. 마지막 describe 같은 경우는 다음 글에서 Dataframe 통계와 관련된 내용을 다루기 전에 이런 기능들이 있다는 것을 보여드리고 싶어 넣어봤습니다.
나머지 index, columns나 values를 활용해서 반복문을 통해 어떤 특정 작업을 할 수 있다는 것을 보여드릴려고 Dataframe에 대한 정보들을 읽는 방법을 실습에 추가했습니다.
--Dataframe 열 읽기
df['2020-03-03']
Dataframe의 열 즉 column을 읽는 것은 배열을 읽는 방식이랑 똑같이 사용하면됩니다.
column의 더 세부적인 데이터는 2차원 배열을 읽듯이 사용하면 됩니다.
--Dataframe 행 읽기
df.loc['apple']
Dataframe의 행 즉 index로 읽는 것은 dataframe의 loc를 이용하면 됩니다.
--Dataframe 행 숫자 index 읽기
df.iloc[0]
iloc를 이용해서 index의 숫자 index로 읽어올 수 있습니다.
--Dataframe 복합 읽기
df.loc['apple':'cherry', '2020-03-04':'2020-03-05']
복합읽기라고 표현했는데, 그냥 행과열을 선택해서 읽을 수 있는 기능입니다. python slicing 기능을 사용해서 loc의 첫번째에 index를 두번째에 column을 넣어서 원하는 부분만 확인할 수 있는 복합읽기 방법입니다.
df.loc[df['2020-03-03']>4000,:]
df[df['2020-03-03':]>4000]
이런 방식들로 조건을 넣어서 Dataframe을 가공할 수도 있습니다.
오늘은 Python Pandas Series와 Dataframe 생성과 읽는 방법을 알아봤습니다. 생성과 읽는 방법만 알아보는데도 많은 글을 쓰게되었네요... 여러가지 방법을 사용해서 Dataframe을 읽고 생성할 수 있습니다. 특히 읽는 방법은 제가 안내해드린 방법 외로도 잘 활용하면 원하는 형태로 데이터를 얻을 수 있습니다. 다음 글에서는 데이터 삽입과 수정 등 Python Pandas를 이용한 Dataframe의 가공과 관련해서 더 알아보겠습니다.
'PYTHON > 데이터분석' 카테고리의 다른 글
[Python] 선형회귀 (2) | 2022.12.26 |
---|---|
인공지능 개념 (0) | 2022.12.26 |
[Python] folium(지도시각화) (0) | 2022.12.26 |
[Python] plot 한글 사용 (0) | 2022.12.26 |
[Python] 스파크(spark) (0) | 2022.12.26 |