본문 바로가기

Programming/Data mining

8. Pandas 심화(scales, pivot table, date function)

Coursera.org 에서 Michigan University의 Applied Data Science with Python의 강의를 토대로 정리한 내용입니다.

오늘은 pandas 심화과정에 대한 컨텐츠를 마무으리! 해보고자 합니다.
먼저 Scale에 대해 빠르게 알아볼게요. 우리가 무언가를 scaling한다고 하면 무슨 말인가요?
다양한 scale방법이 있겠지만 뭐 공통적으로는 어떤 데이터들을 무언가를 기준삼아서 정렬 혹은 그룹핑하게 됩니다.
pandas 에서도 역시 이와 같은 method가 존재하죠.

df['Grades'].astype('category').head()
#이 코드는 앞의 데이터프레임의 타입을 카테고리로 설정하겠다는 것입니다.
>>>
excellent    A+
excellent     A
excellent    A-
good         B+
good          B
Name: Grades, dtype: category
Categories (11, object): [A, A+, A-, B, ..., C+, C-, D, D+]
#위와 같이 성적이 11가지의 카테고리로 분류되었음을 볼 수 있네요.

grades = df['Grades'].astype('category',
                             categories=['D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'],
                             ordered=True)
#이렇게 직접 카테고리 리스트 및 정렬 순서를 정의해주기도 하고요.

pd.cut(df['Grades'],3)
#cut 함수를 통해서 데이터프레임을 3등분하기도 한답니다.

 

또 한가지 알아볼 내용은 Pivot table입니다.
우리는 데이터를 다루면서 어떤 데이터프레임에서 한가지 value를 두가지 축으로 보고싶을 때가 있을 수 있습니다.
이 때 사용하는 것이 바로 pivot table이에요.

df.pivot_table(values='(kW)', index='YEAR', columns='Make', aggfunc=np.mean)
#이처럼 index를 'Year' series로, 각 열의 index를 'Make' series로 두 축에 대하여
#각각 데이터값에 '(kW)' series의 값들을 매칭한 결과의 dataframe이 출력되게 됩니다.
#이때 중복되는 값들에 대해서는 np.mean을 활용해 평균값을 매칭하도록 하였네요.

Pandas는 실제로 데이터들의 값을 저장할 때 매우 유용하게 활용되는 Timestamp와 같은 기능도 제공합니다.

pd.Timestamp('9/1/2016 10:05AM')
>>> Timestamp('2016-09-01 10:05:00')

pd.Period('1/2016')
>>> Period('2016-01', 'M')

t1 = pd.Series(list('abc'), [pd.Timestamp('2016-09-01'), pd.Timestamp('2016-09-02'), pd.Timestamp('2016-09-03')])
>>>
2016-09-01    a
2016-09-02    b
2016-09-03    c
dtype: object

type(t1.index)
>>> pandas.tseries.index.DatetimeIndex

#이외에도 다르게 쓰여진 날짜 표기방식을 통일하는 method도 존재합니다.
d1 = ['2 June 2013', 'Aug 29, 2014', '2015-06-26', '7/12/16']
ts3 = pd.DataFrame(np.random.randint(10, 100, (4,2)), index=d1, columns=list('ab'))
>>>
				a	b
2 June 2013		19	13
Aug 29, 2014	80	30
2015-06-26		80	11
7/12/16			99	47

ts3.index = pd.to_datetime(ts3.index)
>>>
			a	b
2013-06-02	16	46
2014-08-29	14	66
2015-06-26	59	99
2016-07-12	27	17

df.resample('M').mean() #년/월/일을 기준으로 정렬할 수도 있고
df['2017'] #2017년 데이터만 추출할수도 있으며
>>>	Count 1	Count 2
2017-01-08	105	125
2017-01-22	101	123

df['2016-12':] #기준 날짜를 선정할 수도 있답니다.
>>>	Count 1	Count 2
2016-12-11	109	121
2016-12-25	105	126
2017-01-08	105	125
2017-01-22	101	123