안녕하세요. 문범우입니다.
이번 포스팅에서는 파이썬 라이브러리인 pandas(판다스)에 대해서 알아보도록 하겠습니다.
해당 내용은 flearning의 김길호님의 강의를 바탕으로 작성되었습니다.
https://www.flearning.net/courses/6
1. Pandas 란?
Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며 보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 도구 입니다.
먼저 pandas를 사용하기 위해서는 pandas를 설치한 이후에 아래와 같이 import를 해야 합니다.
import pandas as pd
아래 실습에서는 jupyter notebook을 사용하였습니다.
Pandas 기초¶
1. Pandas 란?¶
# pandas 사용하기
import numpy as np # numpy 도 함께 import
import pandas as pd
# Series 정의하기
obj = pd.Series([4, 7, -5, 3])
obj
# Series의 값만 확인하기
obj.values
# Series의 인덱스만 확인하기
obj.index
# Series의 자료형 확인하기
obj.dtypes
# 인덱스를 바꿀 수 있다.
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
# python의 dictionary 자료형을 Series data로 만들 수 있다.
# dictionary의 key가 Series의 index가 된다
sdata = {'Kim': 35000, 'Beomwoo': 67000, 'Joan': 12000, 'Choi': 4000}
obj3 = pd.Series(sdata)
obj3
obj3.name = 'Salary'
obj3.index.name = "Names"
obj3
# index 변경
obj3.index = ['A', 'B', 'C', 'D']
obj3
2-2. Data Frame¶
이번에는 Data Frame에 대해서 알아보도록 하겠습니다.
# Data Frame 정의하기
# 이전에 DataFrame에 들어갈 데이터를 정의해주어야 하는데,
# 이는 python의 dictionary 또는 numpy의 array로 정의할 수 있다.
data = {'name': ['Beomwoo', 'Beomwoo', 'Beomwoo', 'Kim', 'Park'],
'year': [2013, 2014, 2015, 2016, 2015],
'points': [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data)
df
# 행과 열의 구조를 가진 데이터가 생긴다.
# 행 방향의 index
df.index
# 열 방향의 index
df.columns
# 값 얻기
df.values
# 각 인덱스에 대한 이름 설정하기
df.index.name = 'Num'
df.columns.name = 'Info'
df
# DataFrame을 만들면서 columns와 index를 설정할 수 있다.
df2 = pd.DataFrame(data, columns=['year', 'name', 'points', 'penalty'],
index=['one', 'two', 'three', 'four', 'five'])
df2
DataFrame을 정의하면서, data로 들어가는 python dictionary와 columns의 순서가 달라도 알아서 맞춰서 정의된다.
하지만 data에 포함되어 있지 않은 값은 NaN(Not a Number)으로 나타나게 되는데,
이는 null과 같은 개념이다.
NaN값은 추후에 어떠한 방법으로도 처리가 되지 않는 데이터이다.
따라서 올바른 데이터 처리를 위해 추가적으로 값을 넣어줘야 한다.
# describe() 함수는 DataFrame의 계산 가능한 값들에 대한 다양한 계산 값을 보여준다.
df2.describe()
3. DataFrame Indexing¶
data = {"names": ["Kilho", "Kilho", "Kilho", "Charles", "Charles"],
"year": [2014, 2015, 2016, 2015, 2016],
"points": [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data, columns=["year", "names", "points", "penalty"],
index=["one", "two", "three", "four", "five"])
df
3-1. DataFrame에서 열을 선택하고 조작하기¶
df['year']
# 동일한 의미를 갖는, 다른 방법
df.year
df[['year','points']]
# 특정 열에 대해 위와 같이 선택하고, 우리가 원하는 값을 대입할 수 있다.
df['penalty'] = 0.5
df
# 또는
df['penalty'] = [0.1, 0.2, 0.3, 0.4, 0.5] # python의 List나 numpy의 array
df
# 새로운 열을 추가하기
df['zeros'] = np.arange(5)
df
# Series를 추가할 수도 있다.
val = pd.Series([-1.2, -1.5, -1.7], index=['two','four','five'])
df['debt'] = val
df
하지만 Series로 넣을 때는 val와 같이 넣으려는 data의 index에 맞춰서 데이터가 들어간다.
이점이 python list나 numpy array로 데이터를 넣을때와 가장 큰 차이점이다.
df['net_points'] = df['points'] - df['penalty']
df['high_points'] = df['net_points'] > 2.0
df
# 열 삭제하기
del df['high_points']
del df['net_points']
del df['zeros']
df
df.columns
df.index.name = 'Order'
df.columns.name = 'Info'
df
3-2. DataFrame에서 행을 선택하고 조작하기¶
pandas에서는 DataFrame에서 행을 인덱싱하는 방법이 무수히 많다.
물론 위에서 소개했던 열을 선택하는 방법도 수많은 방법중에 하나에 불과하다.
# 0번째 부터 2(3-1) 번째까지 가져온다.
# 뒤에 써준 숫자번째의 행은 뺀다.
df[0:3]
# tow라는 행부터 four라는 행까지 가져온다.
# 뒤에 써준 이름의 행을 빼지 않는다.
df['two':'four'] # 하지만 비추천!
# 아래 방법을 권장한다.
# .loc 또는 .iloc 함수를 사용하는 방법.
df.loc['two'] # 반환 형태는 Series
df.loc['two':'four']
df.loc['two':'four', 'points']
df.loc[:,'year'] # == df['year']
df.loc[:,['year','names']]
df.loc['three':'five','year':'penalty']
# 새로운 행 삽입하기
df.loc['six',:] = [2013,'Jun',4.0,0.1,2.1]
df
# .iloc 사용:: index 번호를 사용한다.
df.iloc[3] # 3번째 행을 가져온다.
df.iloc[3:5, 0:2]
df.iloc[[0,1,3], [1,2]]
df.iloc[:,1:4]
df.iloc[1,1]
4. DataFrame에서의 boolean Indexing¶
df
# year가 2014보다 큰 boolean data
df['year'] > 2014
# year가 2014보다 큰 모든 행의 값
df.loc[df['year']>2014,:]
df.loc[df['names'] == 'Kilho',['names','points']]
# numpy에서와 같이 논리연산을 응용할 수 있다.
df.loc[(df['points']>2)&(df['points']<3),:]
# 새로운 값을 대입할 수도 있다.
df.loc[df['points'] > 3, 'penalty'] = 0
df
5. Data¶
# DataFrame을 만들때 index, column을 설정하지 않으면 기본값으로 0부터 시작하는 정수형 숫자로 입력된다.
df = pd.DataFrame(np.random.randn(6,4))
df
df.columns = ['A', 'B', 'C', 'D']
df.index = pd.date_range('20160701', periods=6)
#pandas에서 제공하는 date range함수는 datetime 자료형으로 구성된, 날짜 시각등을 알 수 있는 자료형을 만드는 함수
df.index
df
# np.nan은 NaN값을 의미한다.
df['F'] = [1.0, np.nan, 3.5, 6.1, np.nan, 7.0]
df
NaN 없애기
# 행의 값중 하나라도 nan인 경우 그 행을 없앤다.
df.dropna(how='any')
# 행의 값의 모든 값이 nan인 경우 그 행으 없앤다.
df.dropna(how='all')
주의 drop함수는 특정 행 또는 열을 drop하고난 DataFrame을 반환한다.
즉, 반환을 받지 않으면 기존의 DataFrame은 그대로이다.
아니면, inplace=True라는 인자를 추가하여, 반환을 받지 않고서도
기존의 DataFrame이 변경되도록 한다.
# nan값에 값 넣기
df.fillna(value=0.5)
# nan값인지 확인하기
df.isnull()
# F열에서 nan값을 포함하는 행만 추출하기
df.loc[df.isnull()['F'],:]
pd.to_datetime('20160701')
# 특정 행 drop하기
df.drop(pd.to_datetime('20160701'))
# 2개 이상도 가능
df.drop([pd.to_datetime('20160702'),pd.to_datetime('20160704')])
# 특정 열 삭제하기
df.drop('F', axis = 1)
# 2개 이상의 열도 가능
df.drop(['B','D'], axis = 1)
6. Data 분석용 함수들¶
data = [[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]]
df = pd.DataFrame(data, columns=["one", "two"], index=["a", "b", "c", "d"])
df
# 행방향으로의 합(즉, 각 열의 합)
df.sum(axis=0)
# 열방향으로의 합(즉, 각 행의 합)
df.sum(axis=1)
이때, 위에서 볼 수 있듯이 NaN값은 배제하고 계산한다.
NaN 값을 배제하지 않고 계산하려면 아래와 같이 skipna에 대해 false를 지정해준다.
df.sum(axis=1, skipna=False)
# 특정 행 또는 특정 열에서만 계산하기
df['one'].sum()
df.loc['b'].sum()
pandas에서 DataFrame에 적용되는 함수들
sum() 함수 이외에도 pandas에서 DataFrame에 적용되는 함수는 다음의 것들이 있다.
count 전체 성분의 (NaN이 아닌) 값의 갯수를 계산
min, max 전체 성분의 최솟, 최댓값을 계산
argmin, argmax 전체 성분의 최솟값, 최댓값이 위치한 (정수)인덱스를 반환
idxmin, idxmax 전체 인덱스 중 최솟값, 최댓값을 반환
quantile 전체 성분의 특정 사분위수에 해당하는 값을 반환 (0~1 사이)
sum 전체 성분의 합을 계산
mean 전체 성분의 평균을 계산
median 전체 성분의 중간값을 반환
mad 전체 성분의 평균값으로부터의 절대 편차(absolute deviation)의 평균을 계산
std, var 전체 성분의 표준편차, 분산을 계산
cumsum 맨 첫 번째 성분부터 각 성분까지의 누적합을 계산 (0에서부터 계속 더해짐)
cumprod 맨 첫번째 성분부터 각 성분까지의 누적곱을 계산 (1에서부터 계속 곱해짐)
df2 = pd.DataFrame(np.random.randn(6, 4),
columns=["A", "B", "C", "D"],
index=pd.date_range("20160701", periods=6))
df2
# A열과 B열의 상관계수 구하기
df2['A'].corr(df2['B'])
# B열과 C열의 공분산 구하기
df2['B'].cov(df2['C'])
정렬함수 및 기타함수¶
dates = df2.index
random_dates = np.random.permutation(dates)
df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
df2
# index와 column의 순서가 섞여있다.
# 이때 index가 오름차순이 되도록 정렬해보자
df2.sort_index(axis=0)
# column을 기준으로?
df2.sort_index(axis=1)
# 내림차순으로는?
df2.sort_index(axis=1, ascending=False)
# 값 기준 정렬하기
# D열의 값이 오름차순이 되도록 정렬하기
df2.sort_values(by='D')
# B열의 값이 내림차순이 되도록 정렬하기
df2.sort_values(by='B', ascending=False)
df2["E"] = np.random.randint(0, 6, size=6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
df2
# E열과 F열을 동시에 고려하여, 오름차순으로 하려면?
df2.sort_values(by=['E','F'])
# 지정한 행 또는 열에서 중복값을 제외한 유니크한 값만 얻기
df2['F'].unique()
# 지정한 행 또는 열에서 값에 따른 개수 얻기
df2['F'].value_counts()
# 지정한 행 또는 열에서 입력한 값이 있는지 확인하기
df2['F'].isin(['alpha','beta'])
# 아래와 같이 응용할 수 있다.
# F열의 값이 alpha나 beta인 모든 행 구하기
df2.loc[df2['F'].isin(['alpha','beta']),:]
사용자가 직접 만든 함수를 적용하기
df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"],
index=["Seoul", "Incheon", "Busan", "Daegu"])
df3
func = lambda x: x.max() - x.min()
df3.apply(func, axis=0)
'AI & BigData > 데이터분석 관련' 카테고리의 다른 글
나이브 베이즈 분류(Naive Bayesian Classification) 란? (1) | 2018.07.07 |
---|---|
Matplotlib 기초 정리 (3) | 2018.06.11 |
numpy(넘파이) 기초 정리 (12) | 2018.06.07 |