CS/Data Science

[CS] 파이썬으로 시작하는 데이터 사이언스 (5)

칸타탓 2020. 11. 9. 22:23

10 minutes to pandas (판다스 실습)

 

참고 : pandas.pydata.org/pandas-docs/version/1.0.0/getting_started/10min.html

 

- numpy, pandas 사용하기

> import numpy as np

> import pandas as pd

numpy : 행렬이나 대규모 다차원 배열을 쉽게 처리 할 수 있도록 지원하는 파이썬 라이브러리

 

- Object 생성하기

(1) Series 만들기

s = pd.Series([1, 3, 5, np.nan, 6, 8])

0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

(2) DataFrame 만들기

dates = pd.date_range('20201110', periods=6)

# 6개의 날짜 정보가 들어간다
DatetimeIndex(['2020-11-10', '2020-11-11', '2020-11-12', '2020-11-13',
'2020-11-14', '2020-11-15'], dtype='datetime64[ns]', freq='D')
# 여러 타입의 데이터가 들아갈 수 있다.
df2 = pd.DataFrame({'A': 1.,
		'B': pd.Timestamp('20201110'),
		'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'})

	A	B		C	D	E	F
0	1.0	2020-11-10	1.0	3	test	foo
1	1.0	2020-11-10	1.0	3	train	foo
2	1.0	2020-11-10	1.0	3	test	foo
3	1.0	2020-11-10	1.0	3	train	foo

# df2.dtypes을 통해 데이터 타입 조회 가능
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object

 

- Data 조회하기

# 지정하지 않으면 모든 데이터 출력
df2.head()
# 하위 3개의 데이터
df2.tail(3)

# index 조회하기
df2.index
# Int64Index([0, 1, 2, 3], dtype='int64') 출력

df2.columns
# Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

to_numpy() : pandas 객체를 numpy 배열 객체인 ndarray로 반환한다.

df2.to_numpy()

array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']],
      dtype=object)
      
# 통계 요약
df2.describe()
	A	C	D
count	4.0	4.0	4.0
mean	1.0	1.0	3.0
std	0.0	0.0	0.0
min	1.0	1.0	3.0
25%	1.0	1.0	3.0
50%	1.0	1.0	3.0
75%	1.0	1.0	3.0
max	1.0	1.0	3.0
# .sort_index()는 인덱스(index)를 기준으로, .sort_values()는 컬럼의 값을 기준으로 데이터 정렬

df2.sort_index(axis=1, ascending=False)
	F	E	D	C	B		A
0	foo	test	3	1.0	2020-11-10	1.0
1	foo	train	3	1.0	2020-11-10	1.0
2	foo	test	3	1.0	2020-11-10	1.0
3	foo	train	3	1.0	2020-11-10	1.0

# B 값을 기준으로 데이터 정렬
df2.sort_values(by='B')

# 여러 개의 컬럼 값을 기준으로 값을 정렬하고 싶을 때
df2.sort_values(by=['B', 'E'] ,ascending=False)

 

- 데이터 다루기(인덱싱)

  • [] : 레이블이나 위치 정수를 기반으로 인덱싱한다.
  • [ : ] : 슬라이싱을 활용하여 인덱싱한다.
  • [boolean value] : 불린 벡터를 이용하여 인덱싱한다.
  • loc[lable] : 레이블을 기반으로 인덱싱한다.
  • iloc[position] : 위치 정수를 기반으로 인덱싱한다.
  • at[label] : 레이블을 기반으로 인덱싱한다.
  • iat[position] : 위치 정수를 기반으로 인덱싱한다.
# 단일 열을 얻기(Series)
df2['A']
0    1.0
1    1.0
2    1.0
3    1.0
Name: A, dtype: float64

# 행 분할하기 (0~2번째 행까지)
df2[0:3]
	A	B		C	D	E	F
0	1.0	2020-11-10	1.0	3	test	foo
1	1.0	2020-11-10	1.0	3	train	foo
2	1.0	2020-11-10	1.0	3	test	foo

# 값을 기준으로 분할할 수도 있다
df2['2020-11-10':'2020-11-11']
# loc
# 열이 아닌 행 단위로 데이터 조회
df.loc[0]
# 1차원 Sereis 형태의 데이터가 리턴된다.
A                      1
B    2020-11-10 00:00:00
C                      1
D                      3
E                   test
F                    foo
G                    one
Name: 0, dtype: object

df.loc[[0]]
# 2차원 배열을 입력하면 2차원인 DataFrame 형태의 데이터 출력
	A	B		C	D	E	F	G
0	1.0	2020-11-10	1.0	3	test	foo	one

# 여러 행 명을 사용하여 데이터를 가져올 수도 있다.
# 0, 1번째 행 데이터를 가져온다.
df.loc[[0, 1]]

# 특정 행만 제외하고 가져올 수 있다.
# 2번째 행만 제외하고 데이터를 DataFrame 형태로 가져온다.
df.loc[df.index != 2]
A	B		C	D	E	F	G
0	1.0	2020-11-10	1.0	3	test	foo	one
1	1.0	2020-11-10	1.0	3	train	foo	one
3	1.0	2020-11-10	1.0	3	train	foo	three

# 열 조회하기
# 모든 행은 :으로 표시
# 쉼표(,)를 입력하고 열명을 입력하면 해당 열만 가져온다.
df.loc[:, 'A']
0    1.0
1    1.0
2    1.0
3    1.0
Name: A, dtype: float64

# DataFrame으로 가져오기
df.loc[:, ['A']]

# 특정 컬럼(B열)만 제외하고 가져오기
df.loc[:, df.columns != 'B']
	A	C	D	E	F	G
0	1.0	1.0	3	test	foo	one
1	1.0	1.0	3	train	foo	one
2	1.0	1.0	3	test	foo	two
3	1.0	1.0	3	train	foo	three

# 행과 열 정보 동시에 가져오기
# 실제 값 하나만 리턴된다. 1.0
df.loc[0, 'A']

# 2차원 DataFrame 리턴
df.loc[[0, 1], ['A', 'B']]
	A	B
0	1.0	2020-11-10
1	1.0	2020-11-10

loc, iloc의 차이 : loc는 레이블을 기반으로 데이터에 접근하지만, iloc는 위치 정수를 기반으로 데이터에 접근한다.

loc와 at의 차이 : 레이블을 통해 값에 접근한다는 점이 공통점이나, at은 하나의 요소에만 접근할 수 있다.

iloc와 iat의 차이 : 위치 정수를 통해 값에 접근한다는 점이 공통점이나, iat은 하나의 요소에만 접근할 수 있다.

# at
# Timestamp('2020-11-10 00:00:00'), 0행 B열에 해당하는 하나의 요소 리턴
df.at[0, 'B']

# iat
# 'test', 0행 4열의 데이터가 출력된다.
df.iat[0, 4]

# iloc
# 위치 정수를 반드시 입력해주어야 한다.
df.iloc[0]
A                      1
B    2020-11-10 00:00:00
C                      1
D                      3
E                   test
F                    foo
G                    one
Name: 0, dtype: object

# 0행 6열의 값 하나를 가져온다. 'one'이 출력
df.iloc[0, 6]

불린 인덱싱을 사용하면 특정 조건에 맞는 데이터만 추출할 수 있다.

# Bool 인덱싱
# 한 번 더 []로 감싸주어야 한다, A가 1보다 클 경우 출력
df2[df2['A'] > 1]

# 필터링 사용하기, one three를 포함하고 있는 경우 출력
df = df2.copy()
df['G'] = ['one', 'one', 'two', 'three']
df[df['G'].isin(['one', 'three'])]
	A	B		C	D	E	F	G
0	1.0	2020-11-10	1.0	3	test	foo	one
1	1.0	2020-11-10	1.0	3	train	foo	one
3	1.0	2020-11-10	1.0	3	train	foo	three