Pandas 라이브러리의 기본 자료형인 dataframe과 series에 대해 배운다. 또한 기본적인 작업인 행, 열 추가 삭제에 대해 배운다. 마지막으로 간단하게 matplotlib라이브러리에 대해 배운다.
PANDAS란?
판다스란 파이썬의 라이브러리 중 하나로 데이터 분석 역할을 하는 라이브러리이다.
PANDAS를 사용하는 이유?
PANDAS는 "대용량 데이터"를 빠르고 쉽게 처리(가공 등)할 수 있도록 도와준다.
1. 전처리
2. 결측치
3. 이상치
4. 피처링
5. 트랜스포메이션(데이터변환)
6. 스케일링(정규화, 표준화)
PANDAS설치
파이썬 기본 내장 라이브러리는 아니기 때문에, 없다면 명령어를 이용해 설치한다.
설치 후에는 다음과 같이 import한다
import pandas as pd
-> 관용적으로 alias를 pd로 한다.
참고) Pandas에서 특수한 자료형은 다음과 같이 표현된다.
pandas.core.xxx.xxx
예를들어 데이터프레임의 경우 pandas.core.frame.DataFrame이며,
시리즈의 경우 pandas.core.series.Series이다.
데이터프레임
엑셀의 sheet와 동일한 개념으로, 2차원의 표, column이름, row의 index로 이루어져 있다.
사용법
df_name = pd.DataFrame(<2D_list>, [columns=<list>], [index=<list>])
columns와 index옵션은 선택이며, 지정하지 않을 경우 리스트의 인덱스 넘버를 따른다.
Dictionary자료형을 이용해서 데이터프레임을 생성하는 것도 가능하다.
df_name = pd.DataFrame(<dictionary>, [index=<list>])
이때 dictionary의 각 키-값 요소는 하나의 "열"을 의미하고, key는 column name, value는 column들의 값을 담은 list이다.
.csv 파일로 데이터프레임 만들기
df_name = pd.read_csv(<csv_pathname>)
데이터프레임의 정보 추출
데이터프레임에서 특정 column을 추출하기
df_name[<colum_name>]
마치 dictionary처럼 접근한다. 참고로 Pandas에서 특정 column 하나는 Series라고 부른다.
가장 앞의 n행 반환
df_name.head([n])
n 생략시 5로 간주됨.
Return: 앞에서부터 n행의 데이터프레임
가장 뒤의 n행 반환
df_name.tail([n])
n 생략시 5로 간주됨.
Return: 뒤에서부터 n행의 데이터프레임
랜덤으로 n개의 행 또는 전체 중 일부 비율만큼 반환
df_name.sample( [[n] | [frac=<value>]] )
n 생략시 1로 간주됨.
frac옵션 생략시 1.0으로 간주됨.
Return: 무작위로 선정된 n개의 행으로 이루어진 데이터프레임
특정 Column으로 큰 순서부터 정렬하여 출력
df_name.nlargest(n, column_name, [keep=<first | last | all>])
n: 위에서부터 반환할 행 갯수
column_name: 정렬 기준이 될 column이름
keep옵션: 지정된 column의 값이 동일할 때, first일 경우 원래 df에서 먼저 오는 행부터, last일 경우 거꾸로, all은 n개를 초과하면서까지 모두 표시. 생략시 기본값은 first
Return: n행의 데이터테이블
특정 Column으로 작은 순서부터 정렬하여 출력
df_name.nsmallest(n, column_name, [keep=<first | last | all>])
작은 순서로 정렬하는 것 빼고 nlargest와 동일함.
데이터프레임의 Information 추출
df_name.describe()
특정 데이터프레임에 관한 통계적 정보를 반환한다.
얻을 수 있는 정보들
1. count
2. mean
3. std -> 표준편차를 의미(standard deviation)
4. min, 25%, 50%, 75%, max
데이터프레임의 전체 행, 열 갯수 보기
df_name.shape (멤버함수가 아닌 멤버변수임!)
자료형: (행, 열) 형태의 tuple
행의 갯수만 출력하기
len(df_name)
데이터프레임의 Index 정보 확인
df_name.index
주의!) 여기서 stop 인덱스는 마지막 인덱스에서 +1인 값임.
Column의 자료형 확인하기
df_name.dtypes
(참고로 문자열은 object로 나옴)
데이터프레임의 구체적인 정보 보기
df.info()
특정 column의 유니크한 값들 보기
df_name[<column_name>].unique()
유니크한 값들이란 중복을 제거한 값들의 목록을 말한다.
하나의 column도 하나의 객체이기 때문에 .unique() 형태로 호출한다.
유니크한 값의 갯수 보기
df_name[<column_name>].value_counts()
열 추가/수정/삭제
Column추가 그리고 수정
데이터프레임에 해당 column이 이미 존재한다면 수정하고, 없으면 새로 추가하는 방식이다.
df_name[<column_name>] = <list>
Series에 list를 대입하는 구조이다. 실제로는 데이터테이블에 새로운 Series(여기서는 column)을 통합시킨다.
Column삭제
df_name.drop(columns=<column_list>, inplace=True)
Column 이름바꾸기
df_name.columns = <column_list>
df_name = df_name.rename(columns=<dictionary>)
Dictionary의 key값은 현재이름, value값은 바꿀 이름이다.
행 추가/변경/삭제
행 추가
df_name = df_name.append(<dictionary>, ignore_index=True)
Dictionary의 key는 column name, value는 data가 들어간다.
인덱스 지정하여 행을 추가/수정
df_name.loc[<index>] = <list>
index가 이미 존재할 경우 수정됨
index가 존재하지 않으면 새롭게 추가됨
행 삭제
df_name.drop(index=<list>, inplace=T/F[, axis=0/1])
인덱스 리스트에 있는 행들을 삭제한다. 만약 삭제하려는 인덱스 행이 존재하지 않는다면 오류.
inplace옵션은 디폴트는 False이다.
1. 옵션이 False라면 drop함수를 호출한 df객체는 drop이 적용되지 않는다. 즉 drop함수를 다른 변수에 대입해야 그 대입된 변수에 drop이 적용된 데이터프레임이 저장된다.
2. 옵션이 True라면 drop함수를 호출한 df객체 자체에 drop이 적용된다. 만약 True상태에서 대입을 시도하려고 한다면 대입되는 변수에는 아무것도 저장되지 않는다.
3. False로 사용하는 것이 더 안전하다.
참고로 axis=1로 하면 행 대신 열을 삭제한다. 디폴트는 axis=0
시리즈
시리즈란 1차원 리스트와 같은 형태의 자료형이다. 엑셀sheet의 열 1개를 의미한다고 생각하면 편하다.
시리즈에는 index가 있고 각 index마다 1대1 대응되는 value들이 있다.
시리즈 생성하기
s_name = pd.Series(<1D_list>)
시리즈의 index/value 가져오기
s_name.index
s_name.values
시리즈의 index 커스터마이징 하기
시리즈는 1차원 리스트와는 달리 index이름을 마음대로 지정할 수 있다. 문자열로도 설정 가능.
s_name.index = <list>
이때 list의 원소 갯수는 시리즈의 원소 갯수와 일치해야 한다.
시리즈의 통계정보 확인하기
전체보기: s_name.describe()
평균: s_name.mean()
최소값: s_name.min()
최대값: s_name.max()
중간값: s_name.median()
표준편차: s_name.std()
전체합: s_name.sum()
통계정보는 무조건 한 열이 모두 숫자형일 때에만 사용이 가능하다.
시리즈 주요 메서드들
값 정렬: s_name.sort_values()
인덱스 정렬: s_name.sort_index()
인덱스 리셋: s_name.reset_index()
특정 값을 가진 부분을 모두 변경: s_name.replace(<prev_value>, <next_value>)
시리즈를 데이터프레임 자료형으로 변환: s_name.to_frame()
특정 데이터프레임에서 시리즈나 부분데이터프레임 추출하기
시리즈 형태로 추출
s_name = df_name[<column_name>]
이때 s_name의 자료형은 Series이다.
(df_name.column_name 형태로도 Series추출 가능하나 column이름에 특수문자나 공백이 없어야함. 언더바_는 가능)
데이터프레임 형태로 추출
단독 열(Series)이 아닌 다중 열을 가지는 데이터프레임 형태로 추출하고 싶다면 인덱스 공간에 문자열 대신 column이름을 가진 리스트를 넣으면 된다.
df_name[<list>]
참고) list에 요소가 한 개라면 series처럼 한 줄만 나오지만 자료형은 series가 아닌 dataframe형식으로 된다.
시리즈/데이터프레임에 조건연산자 적용
시리즈/데이터프레임에 조건연산을 적용할 수 있으며, 이때 반환값의 경우 자료형은 동일하나 각 element들이 조건의 참/거짓 값들로 채워진다.
주의!) 여기에 사용되는 조건연산자는 '&', '|', '~', '^', '==' 등이 사용된다. C언어에서의 비트연산자가 떠오른다.
e.g.) df["col1"] == 100
df[["col1", "col2"]] == 100
조건식이 True인 행만 골라서 반환(출력)
조건연산식을 df_name[]으로 감싸주면 된다.
e.g.) df[df["col1"]==100]
반환 자료형은 DataFrame이다.
여러 조건
e.g.) df[ (df["col1"]==20) | (df["col2"]==3) ]
여러 조건을 사용할 땐 각 조건을 소괄호로 묶어주어야 한다.
행 추출하기
df_name[] 형식은 column정보를 담는 Series를 반환한다. 만약 column이 아닌 row series를 반환하도록 하려면 loc지정자를 사용한다.
df_name.loc[<index> | <index_list>]
여러 행을 추출하고 싶다면 <index>대신 <index_list>를 넣는다. 대신 여러 행을 가지기 때문에 자료형은 DataFrame이다.
데이터프레임의 특정 한 개의 데이터 추출하기
행 추출하기에서 index뒤에 column이름을 추가하면 하나의 데이터만 추출할 수 있다.
df_name.loc[<index>, <column_name>]
데이터프레임 내부에서 특정 구간의 서브데이터프레임 추출하기
서브데이터프레임은 특정 구간의 행, 열을 가지는 데이터프레임으로, 마치 원본 데이터프레임 안에 들어가 있는것 처럼 보인다.
df_name.loc[<index_list>, <column_list>]
loc의 본질은 서브데이터프레임이다!
그래프 그리기(Powered by matplotlib)
matplotlib 라이브러리
matplotlib 라이브러리는 여러가지 그래프를 그려주는 라이브러리이다.
import는 다음과 같이 한다.
import matplotlib.pyplot as plt
관습적으로 plt라고 쓴다.
그래프를 위한 준비물
최소 2개 이상의 list나 Series가 필요하다.
하나는 각 대상의 이름, 나머지 하나는 각 대상에 부여된 값이다.
e.g.)
x = ['a', 'b', 'c', 'd', 'e']
y = [1, 4, 6, 2, 8]
그래프 표시하기
plt.show()
선그래프
plt.plot(<element_name>, <element_value>)
막대그래프
plt.bar(<element_name>, <element_value>)
가로 막대그래프
plt.barh(<element_name>, <element_value>)
산점도
plt.scatter(<element_name>, <element_value>)
두개 이상의 그래프 동시에 그리기
단순히 함수를 여러번 호출하면 된다.
e.g.)
plt.plot(x, y)
plt.scatter(x, y)
그래프 제목 붙이기
plt.title(<title>[, size=<size>])
size옵션은 선택이다.
범례 추가하기
plt.legend()
범례란, 각 모양이 어떤 데이터 카테고리를 의미하는지 써 놓은 것을 말한다.
글자 회전시키기
좌우 공간이 좁을 때, 글자가 겹치지 않게 하기 위해서, 눈금 옆의 문자열을 회전시키는게 좋다.
plt.xticks(rotation=<degree>)
plt.yticks(rotation=<degree>)
| [PLAYDATA] 데이터 엔지니어링 8월 5주차 8/31 (0) | 2023.08.31 |
|---|---|
| [PLAYDATA] 데이터 엔지니어링 8월 5주차 8/30 (0) | 2023.08.30 |
| [PLAYDATA] 데이터 엔지니어링 8월 5주차 8/28 (0) | 2023.08.28 |
| [PLAYDATA] 데이터 엔지니어링 8월 4주차 8/25 (0) | 2023.08.28 |
| [PLAYDATA] 데이터 엔지니어링 8월 4주차 8/24 (0) | 2023.08.24 |