[Python] Pandas 사용
데이터 분석을 위해 파이썬에서는 Pandas와 Numpy 그리고 Matplotlib를 제공한다. 이 글에서는 pandas의 함수사용법에 대해 알아보겠다. pandas는 파이썬의 데이터 처리를 위한 라이브러리이다.
pandas를 사용하기 위해서는 pandas모듈을 import를 해야한다. 보통 pd라는 별칭으로 사용한다.
import pandas as pd
import numpy as np
Series() - 시리즈는 1차원 배열의 값(values)에 각 값에 대응되는 인덱스(index)를 부여할 수 있는 구조를 갖는다
s5 = pd.Series({'국어':100, '영어':95, '수학':90})
s5
->
국어 100
영어 95
수학 90
dtype: int64
index_date = ['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10']
s4 = pd.Series([200, 195, np.nan, 205], index = index_date)
s4
->
2018-10-07 200.0
2018-10-08 195.0
2018-10-09 NaN
2018-10-10 205.0
dtype: float64
date_range() - 날짜 범위 만들기
(freq='D'로 선언하면 day를 기준으로 날짜를 나누겠다는 뜻 -> periods=5로 선언되어 있으므로 시작날짜 2021-02-01부터 5일을 부여하겠다는 의미 / freq는 생략 가능한데 생략할 시 default 값은 'D'(day))
index_date = pd.date_range(start = '2021-02-01', periods = 5, freq='D')
pd.Series([51,62,55,49,58], index = index_date)
->
2021-02-01 51
2021-02-02 62
2021-02-03 55
2021-02-04 49
2021-02-05 58
Freq: D, dtype: int64
DataFrame() - 2차원 데이터 테이블 구조를 가지는 자료형.
데이터프레임은 2차원 리스트를 매개변수로 전달한다. 2차원이므로 행방향 인덱스(index)와 열방향 인덱스(column)가 존재한다. 즉, 행과 열을 가지는 자료구조이다. 시리즈가 인덱스(index)와 값(values)으로 구성된다면, 데이터프레임은 열(columns)까지 추가되어 열(columns), 인덱스(index), 값(values)으로 구성된다.
data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
index_date = pd.date_range('2019-09-01', periods=4)
columns_list = ['A', 'B', 'C']
pd.DataFrame(data, index=index_date, columns=columns_list)
->
A B C
2019-09-01 1 2 3
2019-09-02 4 5 6
2019-09-03 7 8 9
2019-09-04 10 11 12
table_data3 = {'봄': [256.5,264.3,215.9,223.2,312.8],
'여름': [770.6,567.5,599.8,387.1,446.2],
'가을': [363.5,231.2,293.1,247.7,381.6],
'겨울': [139.3,59.9,76.9,109.1,108.1]}
columns_list = ['봄', '여름', '가을', '겨울']
index_list = ['2012', '2013', '2014', '2015', '2016']
df3 = pd.DataFrame(table_data3, columns = columns_list, index = index_list)
df3
->
봄 여름 가을 겨울
2012 256.5 770.6 363.5 139.3
2013 264.3 567.5 231.2 59.9
2014 215.9 599.8 293.1 76.9
2015 223.2 387.1 247.7 109.1
2016 312.8 446.2 381.6 108.1
mean() - 평균 구하기 (axis=1 이면, 행 기준)
df3.mean()
->
봄 254.54
여름 554.24
가을 303.42
겨울 98.66
dtype: float64
df3.mean(axis=1)
->
2012 382.475
2013 280.725
2014 296.425
2015 241.775
2016 312.175
dtype: float64
describe() - 데이터 요약
df3.describe()
->
봄 여름 가을 겨울
count 5.000000 5.000000 5.000000 5.000000
mean 254.540000 554.240000 303.420000 98.660000
std 38.628267 148.888895 67.358496 30.925523
min 215.900000 387.100000 231.200000 59.900000
25% 223.200000 446.200000 247.700000 76.900000
50% 256.500000 567.500000 293.100000 108.100000
75% 264.300000 599.800000 363.500000 109.100000
max 312.800000 770.600000 381.600000 139.300000
데이터 조회
KTX_data = {'경부선 KTX': [39060,39896,42005,43621,41702,41266,32427],
'호남선 KTX': [7313,6967,6873,6626,8675,10622,9228],
'경전선 KTX': [3627,4168,4088,4424,4606,4984,5570],
'전라선 KTX': [309,1771,1954,2244,3146,3945,5766],
'동해선 KTX': [np.nan,np.nan,np.nan,np.nan,2395,3786,6667]}
col_list = ['경부선 KTX', '호남선 KTX', '경전선 KTX', '전라선 KTX', '동해선 KTX']
index_list = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
df_KTX = pd.DataFrame(KTX_data, columns = col_list, index = index_list)
df_KTX
행 기준 indexing
df_KTX[1:2]
index 또는 column 명으로 조회
df_KTX.loc['2013':'2016']
df_KTX['경부선 KTX']['2012':'2014']
->
2012 39896
2013 42005
2014 43621
Name: 경부선 KTX, dtype: int64
.T - 행과 열 바꾸기
df_KTX.T # T -> 행과 열 바꾸기
append() - 테이블 붙이기
(ignore_index=True 일 경우 붙임 당하는 테이블의 index를 이어서 적용한다 (속성 생략 가능))
df1 = pd.DataFrame({'Class1':[95,92,98,100],
'Class2':[91,93,97,99]})
df1
->
Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99
df2 = pd.DataFrame({'Class1': [87,89],
'Class2': [85,90]})
df2
->
Class1 Class2
0 87 85
1 89 90
df1.append(df2, ignore_index=True)
->
Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99
4 87 85
5 89 90
join() - 테이블 합치기
index_label = ['a','b','c','d']
df1a = pd.DataFrame({'Class1':[95,92,98,100],
'Class2':[91,93,97,99]}, index=index_label)
df5 = pd.DataFrame({'Class4':[82,92]})
df1.join(df5)
->
Class1 Class2 Class4
0 95 91 82.0
1 92 93 92.0
2 98 97 NaN
3 100 99 NaN
merge() - 테이블 결합
df_left = pd.DataFrame({'key':['A','B','C'], 'left':[1,2,3]})
df_left
->
key left
0 A 1
1 B 2
2 C 3
df_right = pd.DataFrame({'key':['A','B','D'], 'right':[4,5,6]})
df_right
->
key right
0 A 4
1 B 5
2 D 6
#df_left를 기준(how='left')(df_left가 merge왼쪽에 있으므로)을 두고 on='key'에서 속성 값인 key(컬럼)를 비교하여 key(컬럼)가 일치하거나 left의 key만 있는경우 결합
df_left.merge(df_right, how='left', on='key')
->
key left right
0 A 1 4.0
1 B 2 5.0
2 C 3 NaN
#df_right를 기준(how='right')(df_right가 merge오른쪽에 있으므로)을 두고 on='key'에서 속성 값인 key(컬럼)를 비교하여 key(컬럼)가 일치하거나 right의 key만 있는경우 결합
df_left.merge(df_right, how='right', on='key')
->
key left right
0 A 1.0 4
1 B 2.0 5
2 D NaN 6
df_left.merge(df_right, how='outer', on='key')
->
key left right
0 A 1.0 4.0
1 B 2.0 5.0
2 C 3.0 NaN
3 D NaN 6.0
df_left.merge(df_right, how='inner', on='key')
->
key left right
0 A 1 4
1 B 2 5