- Pandas 사용하기
- Pandas로 1차원 데이터 다루기 - Series
- Pandas로 2차원 데이터 다루기 - dataframe
먼저 pandas 패키지를 설치해야 사용할 수 있다. 터미널이나 shell에서 아래 명령어를 작동하면 된다.
pip install pandas
pandas 설치가 끝났다면 사용하는 법은 어렵지 않다. 기본적으로 import를 이용해 pandas 패키지를 불러오며 pd라고 편하게 줄여 사용하곤 한다.
import pandas as pd
s = pd.Series([1, 4, 9, 16, 25])
'''
0 1
1 4
2 9
3 16
4 25
dtype: int64
'''
t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
'''
one 1
two 2
three 3
four 4
five 5
dtype: int64
'''
인덱스에 접근하거나, 슬라이싱 역시 사용할 수 있다.
s = pd.Series([1, 4, 9, 16, 25])
t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
s[1]
# 4
t[1]
2
t[1:3]
'''
two 2
three 3
dtype: int64
'''
median()이라는 Series의 중앙값보다 큰 값들만 불러오는 함수도 존재한다.
s[s > s.median()]
'''
3 16
4 25
dtype: int64
'''
또한, 여러 인덱스를 한 리스트에 묶어서 반환도 가능하다.
s[[3, 1, 4]]
'''
3 16
1 4
4 25
dtype: int64
'''
Numpy의 함수 역시 사용이 가능하다.
import numpy as np
np.exp(s)
'''
0 2.718282e+00
1 5.459815e+01
2 8.103084e+03
3 8.886111e+06
4 7.200490e+10
dtype: float64
'''
s.dtype
# dtype('int64')
dict의 key, value관계처럼 사용할 수 있다.
t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
'''
one 1
two 2
three 3
four 4
five 5
dtype: int64
'''
t['one']
# 1
# Series에 값 추가
t['six'] = 6
'''
one 1
two 2
three 3
four 4
five 5
six 6
dtype: int64
'''
없는 요소에 접근을 하고 싶다면 어떨까?
'six' in t
# True
'seven' in t
# False
t['seven']
# error 발생
위처럼 error 혹은 False값이 반환되는 것을 알 수 있다. 이를 해결하기 위한 방법이 get()함수라고 할 수 있다. get()함수는 인자가 없다면 None을 반환한다.
t.get('seven')
# None
t.get('seven', 0) # 'seven'이 없다면 0을 반환해라
# 0
s = pd.Series(np.random.randn(5), name='random_nums')
# randn함수는 평균 0, 표준편차 1인 표준정규분포 확률을 따르는 난수를 return한다.
'''
0 -0.902705
1 -2.821488
2 0.536517
3 -1.195965
4 -0.446903
Name: random_nums, dtype: float64
'''
이름을 붙여줬기에 dtype옆에 이름이 표시되는 것을 알 수 있다.
(Series 변수).name = '새로운 이름'
을 통해 새로이 이름을 지정하는 것도 가능하다.
import pandas as pd
d = {'height': [1, 2, 3, 4], 'weight': [30, 40, 50, 60]}
df = pd.DataFrame(d)
height | weight | |
---|---|---|
0 | 1 | 30 |
1 | 2 | 40 |
2 | 3 | 50 |
3 | 4 | 60 |
## dtype 확인하는 법
df.dtypes
'''
height int64
weight int64
dtype: object
'''
Comma Separated Value를 DataFrame으로 생성할 수 있다.
'.read_csv()'를 이용하여 csv를 읽어온다.
r = pd.read_csv("csv가 있는 경로") # 동일 경로에 있다면 ("./~~~.csv") # 읽어오는데에 성공했다면 a rows x b columns 라고 출력된다.
csv파일을 불러오는데에 성공했다면 그 수많은 데이터에서 필요한 데이터만 사용할 수 있어야 한다.
위에서부터 n개의 데이터를 관찰하는 법
df.head(n)
아래에부터 n개의 데이터를 관찰하는 법
df.tail(n)
필요한 열 데이터만 접근하는 법
df['column_name'] or df.column_name
🖐 dataframe의 각 column은 Series로 구성되어 있다. 따라서 위의 열 데이터만 접근하면 Series에 사용가능한 함수를 다 적용할 수 있다.
'조건'을 이용하여 데이터에 접근하는 법
df['column_name'] > 100 ''' 0 True 1 True 2 False ... 3 True ''' df['column_name'] == 'what_name' ...
이렇게 얻어진 열을 key로서 다시 dataframe에 넣어주게 되면 조건에 해당하는, True에 해당하는 데이터들을 볼 수 있다.
df[df['column_name'] > 100]
dataframe의 범주 찾기
df['column_name'].unique() ''' array(['name1', 'name2', 'name3'], dtype=object) '''
위처럼 unique()함수를 사용하게 되면 그 안의 데이터가 중복없이 출력된다.
행을 기준으로 데이터에 접근하기
# 예시 데이터 - 도서관 정보 books_dic = {"Available":[True, True, False], "Location":[102,215,323], "Genre":["Programming", "Physics", "Math"]} books_df = pd.DataFrame(books_dict, index=['책1', '책2', '책3'])
Available Location Genre 책1 True 102 Programming 책2 True 215 Physics 책3 False 323 Math 인덱스를 이용해서 가져오는 법이 있다.
# 인덱스 이름을 이용해서 가져오기 # df.loc[row, col] books_df.loc["책1"] ''' Available True Location 102 Genre Programming Name: 책1, dtype: object ''' # 한 요소에만 접근하기 books_df.loc["책3"]['Available'] # False
# 숫자 인덱스를 이용해서 가져오기 # df.iloc[rowidx, colidx] books_df.iloc[0, 1] # 인덱스 0행의 1열 가지고 오기 # 102 books_df.iloc[1, 0:2] # 인덱스 1행의 0~1열 가지고 오기 ''' Available True Location 215 Name: 책2, dtype: object '''
ndarray의 문법과 유사한 것을 볼 수 있다. 슬라이싱이나 행, 열에 접근하는 방식 역시 유사하다.
groupby 함수 이용하기
- Split : 특정한 "기준"을 바탕으로 DataFrame을 분할
- Apply : 통계함수 - sum(), mean(), median() - 을 적용해서 각 데이터를 압축
- Combine : Apply된 결과를 바탕으로 새로운 Series를 생성 (group_key : applied_value)
# # 1. df에서 원하는 column만 추출한다. # 2. 이를 df의 다른 column을 기준으로 groupby()한다. a = df['column_name'].groupby(by = df["other_colunmn"]) # 이 상태는 분류는 되었지만 아무것도 연산되지는 않았다. a.sum() ''' other column data1 1000 data2 2000 data3 2341 Name: column_name, dtype: int64 ''' a.mean() # sum() / (각 other_column에 해당하는 데이터 수)