먼저 아래의 코드를 import해줍니다.
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
목차
1. 데이터 오브젝트 생성하기
2. 데이터 확인하기 (viewing data)
3. 데이터 선택하기 (selection)
4. 결측치 (missing data)
5. 연산 (operations)
6. 합치기 (merging)
7. 묶기 (grouping)
8. 변형하기 (reshaping)
9. 시계열 데이터 다루기 (time series)
10. 범주형 데이터 다루기 (categoricals)
11. 그래프로 표현하기 (plotting)
12. 데이터 입/출력 (getting data in/out)
1. 데이터 오브젝트 생성하기
데이터 오브젝트는 데이터를 담고있는 그릇입니다. 데이터 오브젝트의 종류는 2가지로 나뉘게 되는데 Series와 DataFrame 2가지가 존재합니다. 이 둘의 차이점은 담고 있는 그릇의 형태입니다. series는 1차원 배열로 값의 위치를 기억하는 정보인 인덱스를 포함하고있습니다. 인덱스는 기본값으로 0부터 시작해서 1씩 증가하는 정수 인덱스가 사용됩니다. DataFrame은 2차원의 배열로 데이터를 담고 있습니다.
- Series는 1차원 배열의 형태를 가지고 인덱스(파랑)라는 한 가지 기준에 따라 데이터가 저장된다.
- DataFrame은 2차원 배열의 형태를 가지고 인덱스(파랑)과 컬럼(주황) 두 가지 기준에 따라 데이터가 저장된다.
판다스의 시리즈는 아래와 같이 데이터를 리스트로 넘겨주어 만들 수 있습니다. 값의 위치를 저장하는 정보인 인덱스가 같이 저장되게 됩니다.
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
>>>
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
판다스의 다른 데이터 오브젝트인 DataFrame은 여러 형태의 데이터를 받아 생성할 수 있습니다. 2차원 배열 형태의 DataFrame의 예시를 보겠습니다.
1. 기본적인 DataFrame
DataFrame의 기본적인 형태는 다음과 같습니다.
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
df1 = pd.DataFrame([[1,3,5],[7,9,11],[5,13,15]])
print(df1)
>>>
0 1 2
0 1 3 5
1 7 9 11
2 5 13 15
df2 = pd.DataFrame([[1,2,3],[4,np.nan,6],[7,8,9]], columns=[0,1,3], index=[0,1,3])
print(df2)
>>>
0 1 3
0 1 2.0 3
1 4 NaN 6
3 7 8.0 9
dates = pd.date_range('20130101', periods=6)
print(dates)
>>>
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print(df)
>>>
A B C D
2013-01-01 -1.677284 -0.539775 -0.493107 -1.643308
2013-01-02 1.224481 -0.145954 1.859631 0.785482
2013-01-03 -0.497292 -0.124510 0.946329 -1.364571
2013-01-04 0.374241 0.033124 1.455312 -0.524993
2013-01-05 -0.426364 -0.463752 0.551149 -0.145972
2013-01-06 0.033156 -0.338685 0.996616 -0.873856
dates는 date_range()함수에 매개변수 periods=6을 넣어 '2013-01-01' 부터 시작하는 6개의 연속적인 날짜 범위가 생성됩니다. DataFrame에선 인덱스를 dates로 하고 컬럼을 문자열 'ABCD'를 넣었습니다. np.random.randn(6, 4)는 평균 0, 표준편차 1을 가지는 난수를 6x4 매트릭스로 생성해주는 함수입니다.
그래서 열은 4개, 컬럼 값도 'ABCD'로 맞춰줬습니다.
2. dict를 사용한 DateFrame
DataFrame을 만드는 또 다른 방법으로는 딕셔러니(dict)로 만드는 방법입니다. 이런 경우 key는 열을 정의하는 컬럼이 되고, 행을 정의하는 인덱스는 자동으로 0부터 시작하여 1씩 증가하는 정수 인덱스가 사용됩니다.
df2 = pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3]*4, dtype='int32'),
'E': pd.Categorical(['test', 'train', 'test', 'train']),
'F': 'foo'})
print(df2)
>>>
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
student_card = pd.DataFrame({'ID':[20190103, 20190222, 20190531],
'name':['Kim', 'Lee', 'Jeong'],
'class':['H', 'W', 'S']})
print(student_card)
>>>
ID name class
0 20190103 Kim H
1 20190222 Lee W
2 20190531 Jeong S
인덱스는 자동으로 0부터 시작하는 정수로 맞춰졌고, 컬럼은 key값으로 대체되었습니다.
즉, key : value가 열을 기준으로 정렬되었다 할 수 있습니다.
3. DateFrame의 타입확인
print(df2.dtypes)
>>>
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
기본적인 수소점은 float64로 표현되고 문자열은 object로 표현됩니다.
2. 데이터 확인하기 (data viewing)
DataFrame에 들어있는 더욱 많은 자료 확인할때는 head()와 tail()함수를 사용할 수 있습니다. 각각 위에 5개 아래에 5개의 항목들을 보여주는데 매개변수에 인수를 넣으면 값 조정이 가능합니다.
print(df.head())
>>>
A B C D
2013-01-01 1.126636 -1.079932 -1.147469 -0.437820
2013-01-02 -0.498032 1.929532 0.949421 0.087551
2013-01-03 -1.225436 0.844363 -1.000215 -1.544771
2013-01-04 1.188030 0.316943 0.920859 0.318728
2013-01-05 0.856831 -0.651026 -1.034243 0.681595
매개변수 지정해 줄때
print(df.tail(3))
>>>
A B C D
2013-01-04 1.188030 0.316943 0.920859 0.318728
2013-01-05 0.856831 -0.651026 -1.034243 0.681595
2013-01-06 -0.803410 -0.689550 -0.455533 0.017479
2-1. .index / .columns / .values
DataFrame의 인덱스를 보기 위해서 .index를 컬럼을 보기 위해선 .columns 속성, numpy데이터를 보기 위해선 .values를 이용할 수 있습니다.
1) .index
print(df.index)
>>>
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
2) .columns
print(df.columns)
>>>
Index(['A', 'B', 'C', 'D'], dtype='object')
3) .values
print(df.values)
>>>
[[ 1.12663592 -1.07993151 -1.14746865 -0.43782004]
[-0.49803245 1.92953205 0.94942081 0.08755124]
[-1.22543552 0.84436298 -1.00021535 -1.5447711 ]
[ 1.18802979 0.31694261 0.92085882 0.31872765]
[ 0.85683061 -0.65102559 -1.03424284 0.68159452]
[-0.80340966 -0.68954978 -0.4555325 0.01747916]]
4) .describe()
describe() 함수는 DataFrame()의 간단한 통계 정보를 보여줍니다. 데이터의 개수(count), 데이터의 평균값(mean), 표준 편차(min), 4분위 수 (25% 50% 75%), 그리고 최댓값(max)를 보여줍니다.
print(df.describe())
>>>
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.107436 0.111722 -0.294530 -0.146206
std 1.071524 1.142556 0.982159 0.777673
min -1.225436 -1.079932 -1.147469 -1.544771
25% -0.727065 -0.679919 -1.025736 -0.323995
50% 0.179399 -0.167041 -0.727874 0.052515
75% 1.059185 0.712508 0.576761 0.260934
max 1.188030 1.929532 0.949421 0.681595
5) .T
.T는 DataFrame을 트랜스포즈 시켜 줍니다. 즉, 행과 열을 바꾸는 거죠.
print(df.T)
>>>
2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
A 1.126636 -0.498032 -1.225436 1.188030 0.856831 -0.803410
B -1.079932 1.929532 0.844363 0.316943 -0.651026 -0.689550
C -1.147469 0.949421 -1.000215 0.920859 -1.034243 -0.455533
D -0.437820 0.087551 -1.544771 0.318728 0.681595 0.017479
3. 데이터 선택하기(selection)
DataFrame이 가지고 있는 [] 슬라이싱 기능을 이용하는 방법입니다. 특정 컬럼만 가져오는 방법으로 df['A']와 같이 사용합니다.
리턴되는 값은 Series 자료구조의 형태를 가지고 있습니다.
print(df['A'])
>>>
2013-01-01 1.126636
2013-01-02 -0.498032
2013-01-03 -1.225436
2013-01-04 1.188030
2013-01-05 0.856831
2013-01-06 -0.803410
Freq: D, Name: A, dtype: float64
1) 특정행을 선택하기
print(df[0:3]) # 첫번째부터 세번째행까지 선택
>>>
A B C D
2013-01-01 1.126636 -1.079932 -1.147469 -0.437820
2013-01-02 -0.498032 1.929532 0.949421 0.087551
2013-01-03 -1.225436 0.844363 -1.000215 -1.544771
2) 인덱스명으로 선택하기
print(df['20130102':'20130105'])
>>>
A B C D
2013-01-02 -0.498032 1.929532 0.949421 0.087551
2013-01-03 -1.225436 0.844363 -1.000215 -1.544771
2013-01-04 1.188030 0.316943 0.920859 0.318728
2013-01-05 0.856831 -0.651026 -1.034243 0.681595
데이터 선택하는 방법
- df[컬럼명]
- df[시작인덱스 : 끝인덱스 + 1]
- df['시작인덱스명' : '끝인덱스명']
3-1. 이름을 이용하여 선택하기
라벨의 이름을 이용하여 선택할 수 있는 .loc를 이용하여 선택할 수 있습니다.
loc는 location의 약자로 데이터 프레임의 행 또는 칼럼의 label이나 boolean array로 인덱싱하는 방법입니다.
1) 특정 컬럼의 값 가져오기
dates[0]은 20130101 입니다.
# dates[0]인 20130101에 해당하는 모든 컬럼의 값 가져오기
print(df.loc[dates[0]])
>>>
A 1.126636
B -1.079932
C -1.147469
D -0.437820
Name: 2013-01-01 00:00:00, dtype: float64
컬럼 ABCD가 인덱스가 되어 index 20130101의 값을 가져왔습니다. 시리즈 형식으로요.
2) 행과 열의 조건에 맞는 값 가져오기(.loc 사용)
1월 2일부터 1월 4일까지의 행을 선택하고 컬럼은 A와 B사이의 값을 선택합니다.
print(df.loc['20130102': '20130104', ['A', 'B']])
>>>
A B
2013-01-02 -0.498032 1.929532
2013-01-03 -1.225436 0.844363
2013-01-04 1.188030 0.316943
3-2. 조건을 이용하여 선택하기
특정한 열의 값들을 기준으로 조건을 만들어 해당 조건을 만족하는 행들만 선택할 수 있는 방법이 있습니다.
print(df[df.A > 0])
>>>
A B C D
2013-01-01 1.126636 -1.079932 -1.147469 -0.437820
2013-01-04 1.188030 0.316943 0.920859 0.318728
2013-01-05 0.856831 -0.651026 -1.034243 0.681595
각 값을 기준으로 만들 수도 있습니다.
print(df[df > 0])
>>>
A B C D
2013-01-01 1.126636 NaN NaN NaN
2013-01-02 NaN 1.929532 0.949421 0.087551
2013-01-03 NaN 0.844363 NaN NaN
2013-01-04 1.188030 0.316943 0.920859 0.318728
2013-01-05 0.856831 NaN NaN 0.681595
2013-01-06 NaN NaN NaN 0.017479
4. 결측치(missing data)
결측값(missing data)란 데이터에서 값이 비어있는 경우를 의미합니다.
판다스에서는 numpy의 nan을 사용해서 결측값을 표현합니다.
df = pd.DataFrame({'x': [1, 2, np.nan, 3]})
print(df)
>>>
x
0 1.0
1 2.0
2 NaN
3 3.0
4-1. 결측값 확인
.isna() 메소드를 사용하여 결측값을 판별할 수 있습니다.
결측값이면 True로 표시됩니다.
print(df['x'].isna())
>>>
0 False
1 False
2 True
3 False
Name: x, dtype: bool
.isnull() 함수도 똑같은 기능을 가지고 있습니다.(이름만 다른 같은 기능의 함수)
결측값이 아님을 확인하려면 .notna() 함수를 사용하면 됩니다. 결측값이 False로 표시됩니다.
print(df['x'].notna())
>>>
0 True
1 True
2 False
3 True
Name: x, dtype: bool
4-2. 결측값 지우기
.dropna() 함수를 사용하면 결측값이 있는 모든 값을 없앨 수 있습니다.
print(df['x'].dropna())
>>>
0 1.0
1 2.0
3 3.0
Name: x, dtype: float64
4-3. 결측값 채우기
.fillna() 함수를 사용하면 결측값을 지정된 값으로 채울 수 있습니다.
매개변수에 값을 넣음으로서 원하는 값을 지정할 수 있습니다.
print(df['x'].fillna(99))
>>>
0 1.0
1 2.0
2 99.0
3 3.0
Name: x, dtype: float64
5. 산술연산(operation)
DataFrame의 연산은 2가지로 나뉩니다.
- DataFrame과 DataFrame의 연산
- DataFrame과 Series의 연산
5-1. DataFrame과 DataFrame의 연산
규칙은 다음과 같습니다.
* 같은 index이면서 같은 column 명을 가진 두 value는 연산함
* 같은 index이면서 같은 column 명을 가진 두 value 중 하나라도 NaN이 있으면 NaN으로 계산함
* index나 column명이 다르면 NaN 처리한다.
연산 방법에는 2가지가 있습니다.
1. 연산자를 이용하는 방법(+, -, x, %)
2. 함수를 이용하는 방법(add, sub, mul, div)
함수를 사용하면 fill_value, axis 옵션을 사용할 수 있습니다.
ex) df1.add(df2, fill_value = 0, axis = 0)
fill_value = 0 # NaN값을 0으로 간주하고 연산, 0이 아닌 값 입력 가능
axis = 0 # DataFrame과 Series간의 연산에서 방향을 지정
df1 = pd.DataFrame([[1,3,5],[7,9,11],[5,13,15]])
df2 = pd.DataFrame([[1,2,3],[4,np.nan,6],[7,8,9]], columns=[0,1,3], index=[0,1,3])
print(df1 + df2)
>>>
0 1 2 3
0 2.0 5.0 NaN NaN
1 11.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
# add함수를 이용한 fill_value 사용
print(df1.add(df2, fill_value=0))
>>>
0 1 2 3
0 2.0 5.0 5.0 3.0
1 11.0 9.0 11.0 6.0
2 5.0 13.0 15.0 NaN
3 7.0 8.0 NaN 9.0
5-2. DataFrame과 Series의 연산
연산함수(add, sub, mul, div)의 axis옵션을 이용해 행, 열 방향으로 연산 가능
- axis = 0은 index방향(행방향)으로 DataFrame과 Series 연산
-> DataFrame과 Series가 동일한 Index를 가지면 연산, 다르면이거나 한쪽만 있으면 NaN - axis = 1은 column방향(열방향)으로 DataFrame과 Series 연산
-> DataFrame과 Series가 동일한 Column명을 가지면 연산, 다르면거나 한쪽만 있으면 NaN
s1 = Series([1,2,3,4])
print(s1)
>>>
0 1
1 2
2 3
3 4
dtype: int64
df1.add(s1, axis = 0)
>>>
0 1 2
0 2.0 4.0 6.0
1 9.0 11.0 13.0
2 8.0 16.0 18.0
3 NaN NaN NaN
print(df1.add(s1, axis = 1))
>>>
0 1 2 3
0 2 5 8 NaN
1 8 11 14 NaN
2 6 15 18 NaN
'[머신러닝] > [Numpy, Pandas]' 카테고리의 다른 글
[Pandas] 판다스 csv, sort_values(), by, ascending, 통계량 계산 (0) | 2023.06.21 |
---|---|
[Pandas] CSV파일에 데이터 쓰기 (0) | 2023.06.21 |
[Numpy] numpy.meshgrid함수 (0) | 2023.06.16 |
[Numpy] linspace함수 (구간 내에 숫자 채우기) (0) | 2023.06.16 |
[Numpy] np.arange 사용법과 range와의 차이 (0) | 2023.06.16 |