
목차
Pandas
- 데이터를 분석할 때 가장 많이 쓰이는 라이브러리다.
- 행과 열을 쉽게 처리할 수 있는 함수를 제공하는 도구이다.
※ 각 열은 단일 데이터 형식만 저장
- numpy보다 유연하게 수치 연산 가능하다.
import pandas as pd pd.__version__ pd? # tab 누르면 사용가능한 여러가지 method를 볼 수 있다.
Out[-] 1.0.1
Series
- index와 values로 이루어진 1차원 배열이다.
- 모든 유형의 데이터를 보유할 수 있다.
- 인덱스를 지정해 줄 수 있다.
- 인덱스 길이는 데이터의 길이와 같아야 한다.
- 명시적 인덱스와 암묵적 인덱스를 가진다.
- loc : 인덱스값을 기반으로 행 데이터를 읽는다.
- iloc : 정수 인덱스을 기반으로 행 데이터를 읽는다.
import pandas as pd import numpy as np
data = np.arange(0, 50, 10) data
Out[-] array([ 0, 10, 20, 30, 40])
a = pd.Series(data, index=['a', 'b', 'c', 'd', 'e']) print(a)
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
b = pd.Series(data) b
Out[-] 0 0 1 10 2 20 3 30 4 40 dtype: int32
a['b']
Out[-] 10
a.loc['b']
Out[-] 10
a.iloc[1]
Out[-] 10
산술연산
a
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
# 더하기 a + 10
Out[-] a 10 b 20 c 30 d 40 e 50 dtype: int32
# 빼기 a - 10
Out[-] a -10 b 0 c 10 d 20 e 30 dtype: int32
# 곱하기 a * 10
Out[-] a 0 b 100 c 200 d 300 e 400 dtype: int32
# 거듭제곱 a ** 2
Out[-] a 0 b 100 c 400 d 900 e 1600 dtype: int32
# 나누기 a / 5
Out[-] a 0.0 b 2.0 c 4.0 d 6.0 e 8.0 dtype: float64
# 몫 a // 5
Out[-] a 0 b 2 c 4 d 6 e 8 dtype: int32
# 나머지 a % 3
Out[-] a 0 b 1 c 2 d 0 e 1 dtype: int32
비교 연산자
a
Out[-] a 0 b 10 c 20 d 30 e 40 dtype: int32
a > 15
Out[-] a False b False c True d True e True dtype: bool
a[a>15]
Out[-] c 20 d 30 e 40 dtype: int32
집계함수
- add : 더하기 함수
- sub : 빼기 함수
- mul : 곱하기 함수
- div : 나누기 함수
- mod : 나머지 구하는 함수
- min : 최소값 구하는 함수
- max : 최대값 구하는 함수
- mean : 평균 구하는 함수
- median : 중앙값 구하는 함수
- std : 표준편차 구하는 함수
- var : 분산 구하는 함수
a.add(100)
Out[-] a 100 b 101 c 102 d 103 e 104 dtype: int32
a.sub(100)
Out[-] a -100 b -90 c -80 d -70 e -60 dtype: int32
a.mul(100)
Out[-] a 0 b 1000 c 2000 d 3000 e 4000 dtype: int32
a.div(100)
Out[-] a 0.0 b 0.1 c 0.2 d 0.3 e 0.4 dtype: float64
a.mod(3)
Out[-] a 0 b 1 c 2 d 0 e 1 dtype: int32
a.min()
Out[-] 0
a.max()
Out[-] 40
a.sum()
Out[-] 100
a.mean()
Out[-] 20.0
a.median()
Out[-] 20.0
a.std()
Out[-] 15.811388300841896
a.var()
Out[-] 250.0
DataFrame
- 2차원 배열에 행과 열에 인덱스를 붙인 것이다.
- 가장 기본적인 데이터 구조이다.
# 50부터 100사이, 4x3형태로 랜덤 생성 rawData = np.random.randint(50, 100, size=(4, 3)) rawData
Out[-] array([[72, 61, 98], [83, 90, 91], [55, 71, 89], [71, 71, 76]])
df = pd.DataFrame(rawData, index=['1반', '2반', '1반', '2반'], columns=['국', '영', '수']) df
Out[-] 국 영 수 1반 72 61 98 2반 83 90 91 1반 55 71 89 2반 71 71 76
#df[0] -> Error df['국']
Out[-] 1반 72 2반 83 1반 55 2반 71 Name: 국, dtype: int32
df
Out[-] 국 영 수 1반 72 61 98 2반 83 90 91 1반 55 71 89 2반 71 71 76
# 열을 추가하여 평균 구하기 df['평균'] = round((df['국']+df['영']+df['수'])/3, 2) df
Out[-] 국 영 수 평균 1반 72 61 98 77.00 2반 83 90 91 88.00 1반 55 71 89 71.67 2반 71 71 76 72.67
# 열('na') 추가하고 NaN값을 넣기 df["na"] = np.nan df
Out[-] 국 영 수 평균 na 1반 72 61 98 77.00 NaN 2반 83 90 91 88.00 NaN 1반 55 71 89 71.67 NaN 2반 71 71 76 72.67 NaN
# del 삭제 del df['na'] df
Out[-] 국 영 수 평균 1반 72 61 98 77.00 2반 83 90 91 88.00 1반 55 71 89 71.67 2반 71 71 76 72.67
df[df.평균 > 75]
Out[-] 국 영 수 평균 1반 72 61 98 77.0 2반 83 90 91 88.0
df = df.drop(["평균"], axis = 'columns') df
Out[-] 국 영 수 1반 72 61 98 2반 83 90 91 1반 55 71 89 2반 71 71 76
결측값 처리
- NaN
- 자료형이 Float형이다.
- 배열에서 연산할 경우 오류가 발생하지 않지만 결과값이 NaN이 된다.
- None
- 자료형이 None이다.
- 배열 연산을 할 경우 오류가 발생한다.
3. 처리방법
- isnull() : 결측값 확인 (결측 이면 True , 결측이 아니면 False )
- notnull() : 결측값 확인 (결측 이면 False , 결측이 아니면 True )
- dropna() : 결측값 삭제
- inplace = True : drop후 원본에 반영
- fillna(Num) : 결측값을 Num으로 채워 넣는다.
df = df.astype('float64') # 타입 변경 df
Out[-] 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 89.0 2반 71.0 71.0 76.0
df['수'][2] = np.nan df
Out[-] 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.dropna(axis=0) # inplace=True # axis=0 : 행 삭제
Out[-] 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2반 71.0 71.0 76.0
df
Out[-] 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.dropna(axis=1) # axis=1 : 열 삭제
Out[-] 국 영 1반 72.0 61.0 2반 83.0 90.0 1반 55.0 71.0 2반 71.0 71.0
df.fillna('hello')
Out[-] 국 영 수 1반 72.0 61.0 98 2반 83.0 90.0 91 1반 55.0 71.0 hello 2반 71.0 71.0 76
df.fillna(0) # 0으로 대체
Out[-] 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 0.0 2반 71.0 71.0 76.0
df.fillna(df.mean()) # 평균으로 대체
Out[-] 국 영 수 1반 72.0 61.0 98.000000 2반 83.0 90.0 91.000000 1반 55.0 71.0 88.333333 2반 71.0 71.0 76.000000
MultiIndex
- Index를 설정할 때 리스트의 리스트 형태로 넣어주면 다중 인덱스가 설정이 된다.
df
Out[-] 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
# index 와 columns을 바꿈 df.T
Out[-] 1반 2반 1반 2반 국 72.0 83.0 55.0 71.0 영 61.0 90.0 71.0 71.0 수 98.0 91.0 NaN 76.0
df
국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.index = [['1학년', '1학년', '2학년', '2학년'], ['1반', '2반', '1반', '2반']] df
Out[-] 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.columns = [['언어', '언어', '수리'],['국', '영', '수']] df
Out[-] 언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df['언어']['국']
Out[-] 1학년 1반 72.0 2반 83.0 2학년 1반 55.0 2반 71.0 Name: 국, dtype: float64
df.iloc[0]
Out[-] 언어 국 72.0 영 61.0 수리 수 98.0 Name: (1학년, 1반), dtype: float64
df.loc['1학년']
Out[-] 언어 수리 국 영 수 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0
df.loc['1학년'].loc['1반']
Out[-] 언어 국 72.0 영 61.0 수리 수 98.0 Name: 1반, dtype: float64
데이터 사전 분석
- info() : DataFrame을 구성하는 행과 열에 대한 정보를 나타내 주는 함수
- head(n) : DataFrame의 처음부터 n줄의 행을 출력
- tail(n) : DataFrame의 마지막 n줄의 행을 출력
- describe() : Series, DataFrame의 각 열에 대한 요약 통계
- dtypes : 데이터 자료형 확인
df
Out[-] 언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.info()
Out[-] <class 'pandas.core.frame.DataFrame'> MultiIndex: 4 entries, (1학년, 1반) to (2학년, 2반) Data columns (total 3 columns): (언어, 국) 4 non-null float64 (언어, 영) 4 non-null float64 (수리, 수) 3 non-null float64 dtypes: float64(3) memory usage: 248.0+ bytes
df.head()
Out[-] 언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.tail()
Out[-] 언어 수리 국 영 수 1학년 1반 72.0 61.0 98.0 2반 83.0 90.0 91.0 2학년 1반 55.0 71.0 NaN 2반 71.0 71.0 76.0
df.dtypes
Out[-] 언어 국 float64 영 float64 수리 수 float64 dtype: object
df.describe()
Out[-] 언어 수리 국 영 수 count 4.000000 4.000000 3.000000 mean 70.250000 73.250000 88.333333 std 11.528949 12.120919 11.239810 min 55.000000 61.000000 76.000000 25% 67.000000 68.500000 83.500000 50% 71.500000 71.000000 91.000000 75% 74.750000 75.750000 94.500000 max 83.000000 90.000000 98.000000
df.isnull() # 결측값 확인, 결과는 bool 형태로 출력
Out[-] 언어 수리 국 영 수 1학년 1반 False False False 2반 False False False 2학년 1반 False False True 2반 False False False
df.isnull().sum() # 결측값 개수 확인
Out[-] 언어 국 0 영 0 수리 수 1 dtype: int64
값의 연결
- concat : DataFrame끼리 결합
- axis=0 or 1 : 아래로 데이터 연결 / 옆으로 데이터 연결
- append : 마지막 행에 데이터를 추가
※ concatenate : 배열끼리 결합
a = pd.DataFrame(np.arange(1, 10).reshape(3, 3)) a
Out[-] 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9
b = pd.Series(np.arange(10, 40, 10)) b
Out[-] 0 10 1 20 2 30 dtype: int32
pd.concat([a, b], axis=1)
Out[-] 0 1 2 0 0 1 2 3 10 1 4 5 6 20 2 7 8 9 30
pd.concat([a, b], axis=1, ignore_index=True)
Out[-] 0 1 2 3 0 1 2 3 10 1 4 5 6 20 2 7 8 9 30
a.append(b, ignore_index=True)
Out[-] 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 3 10 20 30