반응형

안녕하세요.

 

이번 포스팅에서는 파이썬의 대표적인 데이터 분석 모듈인 Pandas (판다스) 에 대해 알아보도록 하겠습니다.

 

 

1. Pandas (판다스)

 

판다스는 고수준의 자료 구조와 빠르고 쉬운 데이터 분석 도구를 제공하는 파이썬의 라이브러리 입니다.

 

Numpy 기반에서 개발되어 Numpy를 사용하는 애플리케이션에서 쉽게 사용이 가능 합니다.

 

여러 형태의 데이터들을 분석하고 정리하는데 유용하게 사용 가능합니다.

 

* 참고 : 아래 사용하는 예시는 'import numpy as np / import pandas as pd' 로 numpy와 pandas를 import 했다는 가정 하에 작성 되었습니다.

 

2. Pandas의 데이터 구조

 

판다스의 자료구조는 시리즈 (Series), 데이터 프레임 (DataFrame), 패널 (Panel) 세 가지가 있습니다.

 

모든 자료구조는 인덱스 (Index) 를 가지고 있습니다.

 

판다스의 인덱스는 리스트에서 사용하는 순서를 나타내는 숫자 인덱스와

 

사전형에서 사용하는 키 인덱스를 모두 포함하고 있습니다.

 

3. Series (시리즈)

 

시리즈는 1차원의 데이터를 다룹니다.

 

1차원 리스트와 유사하지만, 리스트와의 큰 차이점은 인덱스 이름을 부여할 수 있다는 점 입니다.

 

pandas의 Series() 함수를 사용하여 생성 합니다.

 

사용 예시는 다음과 같습니다.

 

# 소스코드

ser1 = pd.Series(np.random.randint(10, 20, 5), index = list('abcde'))  # index를 지정하지 않으면 0 부터의 정수로 할당 됨.
print(ser1)
print(ser1['a'])
print(ser1[0])

print(ser1['a':'c'])

print(ser1[0:2])

print(ser1[['a', 'c', 'e']]) # 슬라이싱을 사용하지 않고, 다수의 값을 가져올 때에는 인덱스 값을 대괄호로 묶습니다.

# print(ser1)의 결과

a    15
b    18
c    19
d    15
e    10
dtype: int32

 

# print(ser['a']) 의 결과
15

 

# print(ser1[0]) 의 결과
15

 

# print(ser1['a':'c']) 의 결과 -> 인덱스 이름으로 슬라이싱을 할 때는 마지막 내용이 포함 됨

a    15 
b    18 
c    19 

dtype: int32

 

# print(ser1[0:2]) 의 결과 -> 인덱스 숫자로 슬라이싱 할 때는 마지막 내용이 포함되지 않음

a    15 
b    18 

dtype: int32

 

# print(ser1[['a', 'c', 'e']]) 의 결과

a    15
c    19
e    10 
dtype: int32

 

4. DataFrame (데이터 프레임)

 

데이터 프레임은 판다스의 2차원 자료구조 입니다.

 

시리즈와 사용 방법은 유사하지만, 2차원, 즉 행과 열이 있습니다.

 

인덱싱 및 슬라이싱은 시리즈와 동일하게 사용 가능합니다.

 

4-1. 데이터 프레임 생성

# 소스코드

 

data = {'name':['N1', 'N2', 'N3', 'N4'], 
        'price':[1,2,3,4], 
        'year':[19,20,21,22],
        'size' : [1.1,2.2,3.3,4.4]
       }

df1 = pd.DataFrame(data, index=list('abcd'))
print(df1)

print(df1.info())

# print(df1)의 결과

  name  price  year  size
a   N1      1    19   1.1
b   N2      2    20   2.2
c   N3      3    21   3.3
d   N4      4    22   4.4

 

# print(df1.info())의 결과

 

<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, a to d
Data columns (total 4 columns):
name     4 non-null object
price    4 non-null int64
year     4 non-null int64
size     4 non-null float64
dtypes: float64(1), int64(2), object(1)
memory usage: 160.0+ bytes
None

 

4-2. 데이터 프레임의 속성값

 

데이터 프레임의 자료 구조를 이해하기 위해 다음과 같은 속성들이 있습니다.

 

* index : index를 반환 한다.

 

* columns : Column 명 (Header)를 반환 한다.

 

* values : 각 값들을 반환 한다.

 

* dtypes : Column 데이터 타입을 반환 한다.

 

* T : 데이터프레임을 치환 한다. (행, 열의 데이터를 치환 한다. 2x3 행렬을 3x2로 치환)

 

# 소스 코드

 

df2 = pd.DataFrame(np.random.randn(4,4), 
                index=['one', 'two', 'three', 'four'],
                columns=['x1', 'x2', 'x3', 'x4'])

print(df2)

print(df2.dtypes)

print(df2.T)

print(df2.values)

print(df2.index)

print(df2.columns)

# df2 의 결과


             x1        x2        x3        x4
one    1.331587  0.715279 -1.545400 -0.008384
two    0.621336 -0.720086  0.265512  0.108549
three  0.004291 -0.174600  0.433026  1.203037
four  -0.965066  1.028274  0.228630  0.445138

 

# df2.dtypes 의 결과

 

x1    float64
x2    float64
x3    float64
x4    float64
dtype: object

 

# df2.T 의 결과


         one       two     three      four
x1  1.331587  0.621336  0.004291 -0.965066
x2  0.715279 -0.720086 -0.174600  1.028274
x3 -1.545400  0.265512  0.433026  0.228630
x4 -0.008384  0.108549  1.203037  0.445138

 

# df2.values 의 결과


[[ 1.3315865   0.71527897 -1.54540029 -0.00838385]
 [ 0.62133597 -0.72008556  0.26551159  0.10854853]
 [ 0.00429143 -0.17460021  0.43302619  1.20303737]
 [-0.96506567  1.02827408  0.22863013  0.44513761]]

 

# df2.index 의 결과


Index(['one', 'two', 'three', 'four'], dtype='object')

 

# df2.columns의 결과


Index(['x1', 'x2', 'x3', 'x4'], dtype='object')

 

4-3. 데이터 프레임의 상위/하위 데이터 조회

 

데이터 프레임의 상위 데이터를 조회할 때에는 head(N) 함수를,

 

하위 데이터를 조회할 때에는 tail(N) 함수를 사용하시면 됩니다.

 

N 에는 조회 할 데이터 갯수를 적어주시면 됩니다. (예 : head(5) -> 상위 5개의 데이터를 조회)

 

 

4-4. 데이터 프레임의 정렬

 

데이터 프레임의 정렬 함수는 sort_index() 함수와 sort_values() 함수 두 종류가 있습니다.

 

sort_index()의 경우는 Index 이름이나 Column 이름으로 정렬을 합니다.

 

sort_index(axis=0) 으로 입력 시엔 Index 이름 기준으로,

 

sort_index(axis=1) 으로 입력 시엔 Column 이름 기준으로 정렬을 합니다.

 

또한 매개변수로 ascending=True 입력 시엔 오름차순, False로 입력 시엔 내림차순으로 정렬 합니다.

 

 

sort_values()는 데이터 값을 기준으로 정렬을 합니다.

 

sort_index() 함수에서 사용한 axis, ascnding 매개변수를 그대로 사용하며,

 

by 라는 매개변수로 index 명이나 column 명을 입력하면 해당 키 값 기준으로 정렬을 합니다.

 

 

4-5. 데이터 프레임의 데이터 선택 방법

 

* obj[val] : 하나의 칼럼, 또는 여러 칼럼을 선택. (배열, 슬라이스, bool 데이터 프레임 사용 가능)

 

* loc : 라벨값 기반의 2차원 인덱싱

 

* iloc : 순서를 나타내는 정수 기반의 2차원 인덱싱

 

* at : 라벨값 기반의 2차원 인덱싱 (한 개의 스칼라 값만 찾는다.)

 

* iat : 순서를 나타내는 정수 기반의 2차원 인덱싱 (한 개의 스칼라 값만 찾는다.)

 

* ix : 정수와 라벨값 모두 사용할 수 있다. (이전 버전에서 사용)

 

특정 스칼라 값을 찾을 경우 loc, iloc 보다 at, iat이 빠릅니다.

 

 

4-6. 데이터 프레임 CSV 파일 입출력

 

판다스에는 데이터 프레임을 통해 CSV 파일의 입출력을 간단하게 해주는 read_csv() 함수와 to_csv() 함수가 있습니다.

 

(pandas.read_csv() / DataFrame.to_csv())

 

두 함수 모두 '파일 명'을 매개 변수로 받습니다.

 

read_csv('파일명') 함수는 CSV 파일을 읽어서 데이터 프레임 형태로,

 

to_csv('파일명') 함수는 데이터 프레임을 CSV 파일로 작성해 줍니다.

 

 

4-7. 데이터 추가/수정/삭제

 

4-7-1. 데이터 추가

 

데이터 프레임에 데이터를 추가 하는 방법은 간단 합니다.

 

사전형 데이터에 데이터를 추가 하듯이 하시면 됩니다.

 

단, index를 추가 시엔 loc 를 활용하시면 됩니다.

 

* df 라는 이름의 데이터프레임을 수정 시

 

- Column 추가 방법 : df['Column명'] = 추가 할 데이터

- Index 추가 방법 : df.loc['Index명'] = 추가 할 데이터

 

4-7-2. 데이터 수정

 

특정 위치, 특정 Index, 특정 Column의 값을 수정하는 것도 간단합니다.

 

왼쪽에는 위에 소개한 데이터 선택 방법을 사용하여 수정할 위치를 선택하고,

 

오른쪽에는 수정할 값을 입력하면 됩니다.

 

예시) df.iat[2,1] = 'A'

 

 

4-7-3. 데이터 삭제

 

데이터 프레임에서 데이터 삭제 시엔 drop() 함수를 사용해 주시면 됩니다.

 

사용할 수 있는 대표적인 매개변수는 다음과 같습니다.

 

* labels : 단일 값이나 배열 형태로 입력 합니다. (키 이름)

 

* axis = 0 or 1 : 행(0) / 열(1) 기준으로 삭제를 합니다.

 

* index : 특정 index 에 대해 데이터를 삭제 합니다.

 

* columns : 특정 column 에 대해 데이터를 삭제 합니다.

 

* inplace = True or False : 원본 데이터를 수정 할 지, 말 지에 대해 선택 합니다.

 

 

4-7-4. 누락 데이터 처리

 

누락 데이터 (Null, NaN)의 처리를 위해 사용하는 함수들이 있습니다.

 

* dropna() : 누락된 데이터가 있는 축을 제외시킨다. (매개변수 : axis, how, thresh, inplace 등)

 

* fillna() : 누락된 데이터를 특정 값으로 대체한다. (ex : fillna(0))

 

* isnull() : Null 값인지 판단한다. (Null 일 경우 True)

 

* notnull() : Null 값이 아닌지 판단한다. (Null 일 경우 False)

 

 

4-8. 기술 통계 함수

 

데이터 프레임에서는 다음 통계 함수들을 사용할 수 있습니다.

 

* sum : 합

 

* mean : 평균

 

* count : Null 값을 제외한 데이터의 수를 반환

 

* argmin, argmax : 최소, 최대를 갖고 있는 데이터의 위치를 반환

 

* quantile : 0부터 1 까지의 분위수를 계산.

 

* describe : 시리즈나 데이터프레임의 각 칼럼에 대한 요약 통계를 계산

 

* var / std : 표준 분산 / 표준 정규 분산

 

* cumsum / cumprod : 누적 합 / 누적 곱

 

* pct_change : 퍼센트 변화율

 

 

4-9. 데이터 프레임 변형 및 병합

 

4-9-1. apply

 

apply 함수는 데이터 프레임에 내장하지 않은 함수 등을 사용하여 데이터 프레임의 데이터를 변형 할 수 있습니다.

 

apply 함수와 다른 함수드를 조합하셔서 데이터를 변형 하시고,

 

변형된 데이터를 데이터프레임에 적용하면 병합이 가능합니다.

 

 예시) df.apply(lambda x : x.max() - x.min())

 

4-9-2. concat

 

concat 함수는 데이터 프레임을 연결하는 방식 입니다.

 

위나 아래로 데이터 행을 연결 합니다.

 

데이터 프레임 뿐만 아니라 시리즈도 연결이 가능합니다.

 

 예시) pd.concat([df1, df2, df3])

 

concat의 axis 매개변수를 이용하면 아래, 또는 옆으로 합칠 수 있습니다.

 (axis=0 -> 아래로, axis=1 -> 옆으로 병합)

 

column 혹은 index 이름 기준으로 병합을 하며,

 

concat은 합집합 개념으로 공통된 column / index가 없을 때에는 NaN 값으로 대체합니다.

 

'keys' 라는 매개변수를 이용하면 합치기 전 각 데이터들을 그룹핑 하여 구분할 수 있게 해줍니다.

 

 예시) pd.concat([df1, df2, df3], keys=[D1, D2, D3])

 

'ignore_index' 라는 매개변수를 이용하면 합친 후 인덱스를 다시 할당 합니다.

 

 예시) pd.concat([df1, df2, df3], ignore_index=True)

 

4-9-3. merge

 

merge는 두 데이터 프레임의 공통 열, 혹은 인덱스를 기준으로 두 개의 테이블을 병합 합니다.

 

이 때 기준이 되는 행이나 열 데이터를 key 라고 합니다.

 

concat 과는 다르게 merge는 공통된 값 (교집합) 만을 합칩니다.

 

기본형은

 

pd.merge(left, right, 옵션값) 이며

 

대표 매개 변수는 다음과 같습니다.

 

* left : Merge 할 1번 데이터 프레임 (필수)

 

* right : Merge 할 2번 데이터 프레임이나 시리즈 (필수)

 

* how : 'left', 'right', 'outer', 'inner' 의 값을 줄 수 있으며, 합집합은 outer, 교집합은 inner 로 주시면 됩니다.

 left를 주시면 left 데이터의 키만, right를 주시면 right 데이터의 키만 취하게 됩니다.

 

* on : Merge 시 기준이 되는 라벨을 가리키게 됩니다.

 

* left_on / right_on : 기준이 되는 key 이름이 left 데이터와 right 데이터가 다를 때, 각 데이터의 key를 정해줄 때 사용 합니다.

 

* left_index / right_index : Index를 key로 주고 싶을 때 사용 합니다.

반응형
Posted by 해리팍
BLOG main image

Chanhyun Park (해리팍)
Software Engineer @ SK hynix

Contact Info.
parkch0708@hanmail.net
chanhyun0708@gmail.com
chanhyun.park@sk.com

카테고리

All (1502)
Profile (2)
Park's Life (600)
Computer System (165)
Computer Programming (39)
Computer Study (54)
Computer Etc. (189)
Scuba Diving (137)
Golf (8)
Traveling (245)
생활 정보 (12)
Pokemon GO (50)