티스토리 뷰

do/Bigdata & A.I

Pandas

dooo.park 2019. 10. 7. 11:02

Pandas

pandas는 데이타 분석(Data Analysis)을 위해 널리 사용되는 파이썬 라이브러리 패키지이다. 

pandas는 과학용 파이썬 배포판인 아나콘다(Anaconda)에 기본적으로 제공되지만, 

아나콘다를 사용하지 않을 경우에는 pip install pandas 를 통해 설치할 수 있다.

 

판다스는 수치형 테이블과 시계열 데이터를 조작하고 운영하기 위한 데이터를 제공하는데,

3조항 BSD 라이선스 조건 하에서 무료로 사용 가능하다.

판다스의 이름은 계량 경제학에서 사용되는 용어인 'PANel DAta'의 앞 글자를 따서 지어졌다. 


판다스는 R에서 사용되던 data.frame 구조를 본뜬 DataFrame이라는 구조를 사용하기 때문에, R의 data.frame에서 사용하던 기능 상당수를 무리없이 사용할 수 있도록 만들었다. 더욱이 파이썬이라는 접근성이 좋은 언어 기반으로 동작하기 때문에 데이터 분석을 파이썬으로 입문하는 사람들이 필수적으로 사용하는 라이브러리가 되었다.

 

특징

- 통합 인덱싱을 활용한 데이터 조작을 가능하게 하는 데이터프레임(DataFrame) 오브젝트
- 인메모리(in-memory) 데이터 구조와 다양한 파일 포맷들 간의 데이터 읽기/쓰기 환경 지원
- 데이터 결측치의 정렬 및 처리
- 데이터셋의 재구조화 및 피보팅
- 레이블 기반의 슬라이싱, 잘 지원된 인덱싱, 대용량 데이터셋에 대한 서브셋 지원
- 데이터 구조의 칼럼 추가 및 삭제
- 데이터셋의 분할-적용-병합을 통한 GroupBy 엔진 지원
- 데이터셋 병합(merging) 및 조인(joining) 지원
- 저차원 데이터에서의 고차원 데이터 처리를 위한 계층적 축 인덱싱 지원
- date range, 빈도 변환, 이동 창 통계, 이동 창 선형회귀, 날짜 이동 등의 시계열 작업 지원
- 데이터 필터 지원

 


1. Pandas 사용하기

 

pandas를 사용하기 위해서는 먼저 pandas를 아래와 같이 import 한다. 

pandas는 크게 세가지의 자료구조를 지원하고 있는데, 

1차원 자료구조인 Series, 2차원 자료구조인 DataFrame, 그리고 3차원 자료구조인 Panel을 지원한다.

import numpy as np
import pandas as pd

 

Series

가장 간단한 1차원 자료구조인 Series는 배열/리스트와 같은 일련의 시퀀스 데이타를 받아들이는데, 

별도의 인덱스 레이블을 지정하지 않으면 자동적으로 0부터 시작되는 디폴트 정수 인덱스를 사용한다.

import pandas as pd
 
data = [1, 3, 5, 7, 9]
s = pd.Series(data)

> 0    1
  1    3
  2    5
  3    7
  4    9
  dtype: int64

 

DataFrame

2차원 자료구조인 DataFrame는 행과 열이 있는 테이블 데이타(Tabular Data)를 받아들이는데, 

아래 예제는 그 한가지 방법으로서 열(column)을 dict의 Key로, 행(row)을 dict의 Value로 한 

Dictionary 데이타를 pd.DataFrame()을 사용하여 pandas의 Data Frame 자료구조로 변환한 예이다.

import pandas as pd
 
data = {
    'year': [2016, 2017, 2018],
    'GDP rate': [2.8, 3.1, 3.0],
    'GDP': ['1.637M', '1.73M', '1.83M']
}
 
df = pd.DataFrame(data)
df

Panel

3차원 자료구조인 Panel은 Axis 0 (items), Axis 1 (major_axis), Axis 2 (minor_axis) 등 3개의 축을 가지고 있는데, 

Axis 0은 그 한 요소가 2차원의 DataFrame 에 해당되며, Axis 1은 DataFrame의 행(row)에 해당되고, 

Axis 2는 DataFrame의 열(column)에 해당된다.

아래 예제는 numpy를 사용하여 3차원 난수를 발생시킨 후, 이를 pandas.Panel() 에 적용한 예이다. 

출력 결과에 보면, 2 (items) x 3 (major_axis) x 4 (minor_axis) 크기의 Panel 객체가 생성되었음을 알 수 있다. 

Panel 객체 p로부터 p[0]을 조회하면, Axis 0 의 첫번째 요소인 DataFrame이 출력됨을 볼 수 있다.

import pandas as pd
import numpy as np

data = np.random.rand(2,3,4)
p = pd.Panel(data)
print(p)

> <class 'pandas.core.panel.Panel'>
  Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis)
  Items axis: 0 to 1
  Major_axis axis: 0 to 2
  Minor_axis axis: 0 to 3
  
p[0]

2. 파일 불러오기 / 저장하기

Pandas는 csv, excel, html, sql 소스에서 데이터를 읽어오는 함수를 제공한다.

불러온 데이터는 Pandas의 Dataframe 객체 형식으로 자동 저장한다.

 

1. CSV : pd.read_csv( ) / pd.to_csv( )

2. EXCEL: pd.read_excel( ) / pd.to_excel( )

3. HTML : pd.read_html( ) / pd.to_html( )

4. SQL : pd.read_sql( ) / pd.to_sql( )

 

CSV

df = pd.read_csv('../example_1.csv')
df

df[df.e == 0]

EXCEL

df = pd.read_excel('./example_2.xlsx')
df
#df.to_excel('example_2.excel', index=False)

HTML

df = pd.read_html('http://www.fdic.gov/bank/individual/failed/banklist.html')
df[0]

3. Pandas 자료형

Pandas의 대표적인 자료형에는 Series와 Dataframe이 있다.

1. Series: Numpy 배열과 유사. 축(axis) 정보를 사용할 수 있다는 점에서 다름
2. Dataframe: 행과 열 이름이 있는 2차원 자료형

 

데이타 엑세스

pandas에서 Series, DataFrame, Panel 등의 자료구조를 만든 후, 다양한 방법을 통해 데이타를 엑세스할 수 있다.
가장 간단한 방식으로 pandas 자료구조에 대해 인덱싱 혹은 속성(Attribute)을 사용하는 것인데, 

예를 들어 위에서 생성한 DataFrame인 df 에 대해 year 행을 가져오기 위해 df["year"] 혹은 df.year 를 사용할 수 있다. 

또한, 부울린 인덱싱 (boolean indexing)을 사용하여 특정 조건의 데이타만 필터링 할 수도 있는데, 

df[df['year'] > 2016]은 2016년 초과인 데이타만 필터링해서 표시한다.

데이타량이 많은 경우는 df.head() 함수를 사용하면 처음 5개 row를 표시해 주며, 

df.tail() 함수를 사용하면 마찬가지로 마지막 5개 row를 표시해 준다.

import pandas as pd
 
data = {
    'year': [2016, 2017, 2018],
    'GDP rate': [2.8, 3.1, 3.0],
    'GDP': ['1.637M', '1.73M', '1.83M']
}
 
df = pd.DataFrame(data)

df['year']

> 0    2016
  1    2017
  2    2018
  Name: year, dtype: int64
  
df.year

> 0    2016
  1    2017
  2    2018
  Name: year, dtype: int64
df[df['year'] > 2016] #boolean indexing

sum = df['GDP rate'].sum()
avg = df['GDP rate'].mean()
print(sum, avg)

> 8.9 2.966666666666667
df.describe()

pandas는 데이타에 대한 다양한 연산 함수들을 제공하고 있는데, 예를 들어 합계 구하는 sum(), 평균을 구하는 mean(), 최소를 구하는 min(), 최대를 구하는 max() 등을 사용할 수 있다. 또한, 위 그림에서 보듯이, 기본적인 통계치를 모두 표시하기 위해 describe() 함수를 사용할 수 있다.

 

 

Series 생성

1. 리스트를 Series로 변환하거나
2. 사전(dictionary)을 Series로 변환할 수 있음

# list -> Series
idx = ['a', 'b', 'c']
lst = [10, 20, 30]

pd.Series(data=lst)

> 0    10
  1    20
  2    30
  dtype: int64
pd.Series(data=idx)

> 0    a
  1    b
  2    c
  dtype: object
pd.Series(data=lst, index=idx)

> a    10
  b    20
  c    30
  dtype: int64
# array -> Series
arr = np.array([10, 20, 30])

pd.Series(data=arr)

> 0    10
  1    20
  2    30
  dtype: int32
# dictionary -> Series
dic = {'a':10, 'b':20, 'c':30}

dic = {'a': [10,10], 'b':[20,20], 'c':[30,30]}

ser = pd.Series(dic)
ser

> a    [10, 10]
  b    [20, 20]
  c    [30, 30]
  dtype: object
ser['a']

> [10, 10]

 

Series.values

해당 시리즈 객체의 값들만 반환한다

Series.index

해당 시리즈의 색인(index)만 반환한다

Series( 배열, index = 지정하고 싶은 index list )

Series 객체를 생성할 때 색인을 미리 지정할 수 있다. 색인 리스트는 보통 색인의 값을 따로 저장을 주로 해놓는다.
ex) >> index_list = ['a', 'b', 'c', 'd']
     >> a = Series(data, index= index_list)

Series[ index  ]

배열에서 값을 선택하거나 대입할 때는 색인을 이용한다. 이는 파이썬의 일반적인 자료 접근 방식과 유사하다.

Series[ conditions ]

conditions에는 논리연산이 올 수 있다. a라는 Series가 있다고 했을 때, a[ a>0 ]은 a라는 Series에서 값이 0 이상인 것만 반환하라는 의미이다.  conditions는 파이썬에서 사용하는 conditions는 모두 올 수 있다.

비슷하게 NumPy에서 벡터 연산을 한 것처럼 Series도 비슷하게 산술연산을 하거나 수학 함수를 적용할 수 있다. 물론 각 값에 해당 연산이 수행된다. NumPy 배열 연산을 Pandas 자료구조에도 적용할 수 있다. ex) a*2,   np.exp(a)

Dictionary to Series

파이썬 사전 객체를 Series 객체로 생성할 수도 있음
{'색인' : 값, '색인': 값, .... }

Series.isnull()

누락된 데이터가 있는지 없는지 확인할 때 사용함. Series에서는 메소드로 기능 제공 

pd.isnull(object)
pd.notnull(object)

Series는 산술연산도 가능하며
Series의 색인은 모두 name  속성이 있음
  > object.name = '@@@'    // Series에 대한 이름
  > object.index.name = '@@@'   // index(색인)에 대한 이름

 

4. DataFrame

  1. DataFrame = Series + Series + ... + Series
  2. 거의 모든 데이터 처리에 DataFrame을 사용한다.
  3. 데이터프레임 정보 보기: head(), shape()  
  4. 특정 요소에 접근하기
  5. 데이터프레임 쪼개고 합치기
  6. 누락 데이터 처리하기

 

Dataframe 생성

# 기본 데이터프레임 생성
df = pd.DataFrame(np.random.randn(5,5))
print(df)

>           0         1         2         3         4
  0 -0.696230 -1.004227  1.598603 -1.701004  2.138426
  1  0.179232  1.518900 -1.566094  1.791049  0.815923
  2 -0.885299  0.472704  0.259057  0.234970  0.068572
  3 -1.001301 -1.409933  0.571051  1.713094  0.076227
  4 -1.351073  1.021602  1.614244  1.973300 -0.686073
# col 이름, row 이름과 함께 데이터프레임 생성
df = pd.DataFrame(np.random.randn(5,5), index=['A','B','C','D','E'], columns=['V','W','X','Y','Z'])
df

Dataframe 살펴보기

df.shape

> (5, 5)

df.columns

> Index(['V', 'W', 'X', 'Y', 'Z'], dtype='object')

df.index

> Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
df.head()

df.info()

> <class 'pandas.core.frame.DataFrame'>
  Index: 5 entries, A to E
  Data columns (total 5 columns):
  V    5 non-null float64
  W    5 non-null float64
  X    5 non-null float64
  Y    5 non-null float64
  Z    5 non-null float64
  dtypes: float64(5)
  memory usage: 240.0+ bytes
df.describe()

Dataframe 접근

type(df['V'])
df['V']

> A    0.750835
  B    0.036400
  C    0.733487
  D   -2.275105
  E   -0.827032
  Name: V, dtype: float64
df[['V', 'W']]

# 조건부 접근
df>-1

df_nan = df[df>-1]
df_nan

# 특정 조건에 해당하는 데이터만 선택
df[df['W']>0]

# 다중 조건도 가능
df[(df['W']>0) & (df['X'] > 1)]

DataFrame Row 접근

  1. loc : 라벨값 기반의 2차원 인덱싱
  2. iloc : 순서를 나타내는 정수 기반의 2차원 인덱싱 (일반 배열처럼 사용)

 

df = pd.read_csv('./example_1.csv')
df

loc

# 첫 번째 row 선택
df.loc[0]

> a    1
  b    2
  c    3
  d    4
  e    1
  Name: 0, dtype: int64
# 첫 번째 row, 첫번째 col 선택
df.loc[0, 'a']

> 1
# 조건에 맞는 col만 선택
df.loc[df.e > 0, :]

# row와 col을 한꺼번에 가져오기
df.loc[[0,1],['a','b']]

iloc

df.iloc[0,0]

> 1
df.iloc[0,:]

> a    1
  b    2
  c    3
  d    4
  e    1
  Name: 0, dtype: int64

DataFrame 합치기

  1. 새로운 col 또는 row 추가
  2. col을 기준으로 데이터프레임 병합
  3. row를 기준으로 데이터프레임 병합

 

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                        index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                        'B': ['B4', 'B5', 'B6', 'B7'],
                        'C': ['C4', 'C5', 'C6', 'C7'],
                        'D': ['D4', 'D5', 'D6', 'D7']},
                         index=[0, 1, 2, 3]) 
                         
df1

df2

pd.concat()

# row 기준 병합
pd.concat([df1, df2])

# col 기준 병합 
pd.concat([df1, df2], axis=1)

# 새로운 col을 데이터프레임에 추가
df1["new"] = [1,2,3,4]
df1

# 열 제거
df1 = df1.drop('new', axis=1)
df1

df1.drop('D', axis=1, inplace=True)
df1

행과 열을 그룹화 분석

import pandas as pd
# Create dataframe
data = {'Company':['GOOG','GOOG','MSFT','MSFT','FB','FB'],
       'Person':['Sam','Charlie','Amy','Vanessa','Carl','Sarah'],
       'Sales':[200,120,340,124,243,350]}

df = pd.DataFrame(data)
df

# 회사명을 기준으로 모으기
by_comp = df.groupby('Company')

# 회사별 평균 매출 확인하기 (min, max, mean, count, describe)
by_comp.mean()

정렬

df = pd.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['abc','def','ghi','xyz']})
df

df.sort_values(by='col2')

DataFrame( data, columns = column_list, index = index_list )

DataFrame[ column_name ] , DataFrame.column_name
데이터프레임은 사전처럼 색인으로 컬럼에 접근('[ ]')할 수 있고 속성(attribute)로 접근하는 방법('.')으로도 열(column)을 불러올 수 있다. column에도 값을 대입할 수 있다. Series와 동일한 방식이다.
ex) df['a'] = 0   #a라는 열column의 값은 모두 0으로 대입
 
배열의 값도 대입할 수 있다.
ex) df['b'] = np.arange(5.)
list나 array의 값을 열(column)에 대입할 때는 대입하려는 값의 길이가 DataFrame의 크기와 같아야 한다.

없는 컬럼을 대입하면 새로운 컬럼이 생성된다

Dataframe[column] = statement
데이터프레임의 컬럼에 직접 value나 statement를 입력하여서 컬럼에 값을 대입할 수 있다
리스트나 배열을 칼럼에 대입할 때는 대입하려는 값의 길이가 DataFrame의 크기와 같아야 한다. Series를 대입하면 색인에 따라 값이 대입되고 색인이 없는 것에는 대입되지 않음

ex) df['col1'] = 16.5
ex) df['col2'] = np.arange(5.)
ex) df['col3'] = df.name == 'Olleh'   // 논리연산으로 반환되는 배열도 가능

del DataFrame['column_name']
파이썬 예약어 del을 사용해서 파이썬 사전형에서처럼 데이터프레임의 열(column)을 삭제할 수 있다.

Nested Dictionaries to DataFrame
중첩된 사전 형태의 자료구조로도 데이터프레임을 생성할 수 있다.

ex) >> data =  { 'a' : { 'b' : 1 } }
       >> DataFrame(data)
위와 같은 경우는 column이 'a' 이고 row의 색인이 'b'인 데이터 프레임이 만들어진다.

중첩된 경우라고 할지라도 DataFrame(data, index = 인덱스리스트) 인덱스리스트에 색인을 집어넣으면 

지정된 색인으로 DataFrame이 생성된다.

DataFrame.T
행과 열을 뒤집어 버린다.

NumPy에서처럼 동일하게 동작한다. 2행 3열이면 3행 2열로 바뀌며 색인의 위치도 변경된다.

DataFrame.values
Series와 동일하게 값들을 다차원 배열로 반환한다

DataFrame.index
마찬가지로 Series와 동일하다.

DataFrame.columns
데이터프레임에 있는 모든 열을 인덱스 배열로 반환하다

 

DataFrame 생성자에서 입력 가능한 데이터

Type

Contents 

2차원 ndarray 

데이터를 담고 있는 행렬

행과 열을 선택해서 데이터프레임으로 만들 수 있다

배열, 리스트, 사전 

사전의 모든 항목은 같은 길이를 가져야 한다

key 값이 컬럼이 됨 

NumPy 배열 

배열의 사전과 같은 방식으로 됨 

Series 사전 

Series의 각 값이 컬럼이 됨. 명시적으로 색인을 넘겨주지 않으면

각 Series의 색인이 하나로 합쳐져 행이 됨 

사전의 사전 

가장 외부에 있는 key가 컬럼이 되고 내부 사전의 key가 색인이 됨 

사전이나 Series 리스트 

리스트의 각 항목이 데이터프레임의 row가 됨. 

리스트나 튜플의 리스트 

2차원 ndarray와 동일 

다른 DataFrame 

색인을 따로 지정하지 않으면 이전 데이터프레임 색인과 동일 

NumPy MaskedArray 

'2차원 ndarray'와 같은 방식이지만 마스크 값은

반환되는 DataFrame에서 NA 값이 됨 

 

Index Object

pandas의 색인 객체는 각 행과 열에 대한 이름과 다른 meta data를 저장하는 객체임.
색인 객체는 변경할 수 없어 안전하게 공유가능
pandas에는 내장 색인 클래스가 정리되어 있어 특수한 목적으로 축을 색인하는 기능을 개발하기 위해서 

Index 클래스의 Sub클래스를 만들수 있음


Index 클래스

Index 클래스는 일반적인 색인 객체이며 NumPy 배열 형식으로 축의 이름을 표현
Int64Index 클래스는 정수 값을 위한 색인 객체
MultiIndex 단일 축에 여러 단계의 색인을 표현하는 계층적 색인 객체. 튜플의 배열과 유사
DatetimeIndex 나노초 타임스탬프를 저장함 datetime64 dtype
PeriodIndex 기간데이터를 위한 특수한 Index

Index.append
추가적인 Index 객체를 덧붙여 새로운 색인 반환

Index.diff
색인의 차집합을 반환

Index.intersection
색인의 교집합을 반환

Index.union
색인의 합집합을 반환

Index.isin
넘겨 받은 값이 해당 색인 위치에 존재하는지 알려주는 불리언 배열을 반환

Index.delete
i 위치의 색인이 삭제된 새로운 색인을 반환

Index.drop
넘겨받은 값이 삭제된 새로운 색인을 반환

Index.insert
i 위치에 값이 추가된 새로운 색인을 반환

Index.is_monotonic
색인이 단조성을 가진다면 True를 반환

Index.is_unique
중복되는 색인이 없다면 True를 반환

Index.unique
색인에서 유일한 값만을 반환

 

Pandas 통계 메서드

df.sum()

df.count()

df.describe() 와 같은식으로 사용

메서드 

설명 

 count

 NA 값을 제외한 값의 수를 반환 

 describe 

 시리즈 혹은 데이터프레임의 각 열에 대한 요약 통계 

 min, max

 최소, 최대값 

 argmin, argmax 

 최소, 최대값을 갖고 있는 색인 위치 반환 

 idxmin, idxmanx 

 최소 최대값 갖고 있는 색인의 값 반환 

 quantile 

 0부터 1까지의 분위수 계산 

 sum 

 합 

 mean 

 평균 

 median 

 중위값 

 mad

 평균값에서 절대 평균편차 

 var 

 표본 분산 

 std 

 표본 정규분산 

 skew 

 표본 비대칭도 

 kurt 

 표본 첨도 

 cumsum 

 누적 합 

 cummin, cummax 

 누적 최소값, 누적 최대값 

 cumprod 

 누적 곱 

 diff 

 1차 산술차 (시계열 데이터 사용시 유용) 

 pct_change 

 퍼센트 변화율 계산 

 

 

 


참고사이트

http://pythonstudy.xyz/python/article/408-pandas-%EB%8D%B0%EC%9D%B4%ED%83%80-%EB%B6%84%EC%84%9D

https://namu.wiki/w/pandas

https://sacko.tistory.com/18

 

 

 

'do > Bigdata & A.I' 카테고리의 다른 글

Numpy  (0) 2019.10.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함