본문 바로가기
머신러닝

Pandas에 대해 (Series, DataFrame)

by 제리의 세계 2023. 4. 30.

안녕하세요! 제리입니다.

오늘은 데이터 분석에서 거의 필수 요소라고 생각되는 pandas에 대해서 다뤄보려고 합니다.

Pandas란?

고수준의 자료 구조와 빠르고 쉬운 데이터 분석도구를 제공

Pandas에 대해서 알기 위해서는 Series와 DataFrame이라는 것을 먼저 알아야합니다.

Series란?

일련의 객체를 담을 수 있는 1차원 배열 구조

넘파이의 배열과 유사하다고 보시면 될 것 같습니다!

# numpy와 pandas의 경우 np, pd로 줄여서 사용합니다.
import numpy as np
import pandas as pd

labels = ['a','b','c']
my_list = [10,20,30]
arr = np.array([10,20,30]) 

# 딕셔너리 형태
d = {'a':10,'b':20,'c':30}

# Series 형태로 보여주기
pd.Series(data=my_list)
0    10
1    20
2    30
dtype: int64

# index는 앞의 일련의 숫자라고 생각하시면 편합니다.
# 본래는 위와 같이 0,1,2 이지만 index = 으로 새롭게 지정해줄 수 있습니다.
pd.Series(data=my_list,index=labels)

a    10
b    20
c    30
dtype: int64

pd.Series(my_list,labels)

a    10
b    20
c    30
dtype: int64

# 배열 형태로 시리즈로 바꿔줄 수 있습니다.
pd.Series(arr)

0    10
1    20
2    30
dtype: int32

pd.Series(arr,labels)

a    10
b    20
c    30
dtype: int32

# 딕셔너리 형태 또한 시리즈로 바꿀 수 있습니다.
pd.Series(d)

a    10
b    20
c    30
dtype: int64

#인덱스 사용하기

a = pd.Series(data=my_list,index=labels)
a

a    10
b    20
c    30
dtype: int64

# 시리즈 내에 인덱스를 통해 값을 가져올 수 있습니다.
a['a']

10

b = pd.Series(data=my_list,index=labels)
b

a    10
b    20
c    30
dtype: int64

# 시리즈와 시리즈끼리 덧셈도 가능합니다!
a+b

a    20
b    40
c    60
dtype: int64

이정도가 대략적인 판다스의 시리즈 형태입니다.

혹시 어느정도 감이 잡혔을 지 모르겠습니다,,,,

그래도 이런 인덱스 형태를 통해 값을 불러오는 기능은 상당히 데이터 분석에 있어서 많이 사용하니

꼭 알아두시는 것을 추천합니다.

 

DataFrame이란?

2차원 자료구조로 표 같은 형태라고 생각하시면 좋겠습니다! 

1. 딕셔너리 형태로 데이터를 정의해주세요.

(딕셔너리의 키 값 개수가 열의 개수가 되고 리스트 안의 개수가 행의 개수가 됩니다.)

2. 딕셔너리를 pd.Dataframe 안에 넣어주시면 끝!

(물론 index와 columns를 통해 지정해주시면 더 눈에 띄게 볼 수 있습니다.)

 

import pandas as pd
import numpy as np
# 넘파이 중 랜덤한 값을 입력해주는 randn을 불러옵시다.
from numpy.random import randn
# 동일한 값을 얻기 위해서는 흔히 ssed라고 불리는 것을 지정해주면 랜덤한 값을 얻지만 동일한 시드 내에서 같은 결과를 출력해주도록 합니다.
np.random.seed(101)
# 이렇게 값만 주고 인덱스와 컬럼명만 입력해줘도 데이터프레임이 만들어집니다.
df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())
df
W	X	Y	Z
A	2.706850	0.628133	0.907969	0.503826
B	0.651118	-0.319318	-0.848077	0.605965
C	-2.018168	0.740122	0.528813	-0.589001
D	0.188695	-0.758872	-0.933237	0.955057
E	0.190794	1.978757	2.605967	0.683509
# 이런 식으로 딕셔너리를 생성해줍니다.
data = {'2016' : [1,2,3],
       '2017' : [1,3,5],
       '2018' : [2,4,6]}
# 컬럼으로 넣을 값들을 지정해줍니다.
column = ['2016','2017','2018']
# 인덱스도 지정해줄 수 있습니다.
index = ['처음','두번째','세번째']
# 아래와 같이 데이터프레임을 생성해줄 수 있습니다.
data = pd.DataFrame(data, index = index, columns = column)
data
2016	2017	2018
처음	1	1	2
두번째	2	3	4
세번째	3	5	6
# 데이터프레임 또한 인덱스가 가능합니다.
df['W']
A    2.706850
B    0.651118
C   -2.018168
D    0.188695
E    0.190794
Name: W, dtype: float64
# 데이터 프레임 형태로의 값을 가져오려면 [[?]]  사용하시면 됩니다.
df[['W']]
W
A	2.706850
B	0.651118
C	-2.018168
D	0.188695
E	0.190794
# 새롭게 열을 생성할 수 있습니다.
df['new'] = df['W'] + df['Y']
df
W	X	Y	Z	new
A	2.706850	0.628133	0.907969	0.503826	3.614819
B	0.651118	-0.319318	-0.848077	0.605965	-0.196959
C	-2.018168	0.740122	0.528813	-0.589001	-1.489355
D	0.188695	-0.758872	-0.933237	0.955057	-0.744542
E	0.190794	1.978757	2.605967	0.683509	2.796762
# 열을 제거할 수도 있습니다.
# 여기서 axis = 1 이라면 열을, axis = 0 이면 행을 삭제하는 것입니다.
df.drop('new',axis=1)
W	X	Y	Z
A	2.706850	0.628133	0.907969	0.503826
B	0.651118	-0.319318	-0.848077	0.605965
C	-2.018168	0.740122	0.528813	-0.589001
D	0.188695	-0.758872	-0.933237	0.955057
E	0.190794	1.978757	2.605967	0.683509
# 만일 inplace = True를 사용하지 않거나, 다시 변수에 저장해주지 않으면 삭제되지 않습니다.
df
W	X	Y	Z	new
A	2.706850	0.628133	0.907969	0.503826	3.614819
B	0.651118	-0.319318	-0.848077	0.605965	-0.196959
C	-2.018168	0.740122	0.528813	-0.589001	-1.489355
D	0.188695	-0.758872	-0.933237	0.955057	-0.744542
E	0.190794	1.978757	2.605967	0.683509	2.796762
# 바로 삭제를 위해서는 이렇게 inplace = True를 사용하시면 됩니다.
df.drop('new',axis=1,inplace=True)
df
W	X	Y	Z
A	2.706850	0.628133	0.907969	0.503826
B	0.651118	-0.319318	-0.848077	0.605965
C	-2.018168	0.740122	0.528813	-0.589001
D	0.188695	-0.758872	-0.933237	0.955057
E	0.190794	1.978757	2.605967	0.683509
# loc의 경우 라벨 값 기반으로 인덱싱을 진행합니다.
df.loc['A']
W    2.706850
X    0.628133
Y    0.907969
Z    0.503826
Name: A, dtype: float64
# 이렇게 loc를 이용해 특정 라벨 값들로만 구성된 데이터프레임만 가져올 수 있습니다.
df.loc[['A','B'],['W','Y']]
W	Y
A	2.706850	0.907969
B	0.651118	-0.848077
# iloc의 경우 순서에 기반해서 인덱스 번호에 맞는 값을 출력합니다.
df.iloc[2]
W   -2.018168
X    0.740122
Y    0.528813
Z   -0.589001
Name: C, dtype: float64
# 인덱스를 초기화 하는 방법입니다.
df.reset_index()

# 이와 반대로 set_index()를 하면 인덱스를 변경할 수 있습니다.
# 주로 시계열 자료 때 많이 사용합니다.
index	W	X	Y	Z
0	A	2.706850	0.628133	0.907969	0.503826
1	B	0.651118	-0.319318	-0.848077	0.605965
2	C	-2.018168	0.740122	0.528813	-0.589001
3	D	0.188695	-0.758872	-0.933237	0.955057
4	E	0.190794	1.978757	2.605967	0.683509
# 이것 또한 inplace = True를 사용하지 않으면 자동으로 변경되지 않습니다.
df
W	X	Y	Z
A	2.706850	0.628133	0.907969	0.503826
B	0.651118	-0.319318	-0.848077	0.605965
C	-2.018168	0.740122	0.528813	-0.589001
D	0.188695	-0.758872	-0.933237	0.955057
E	0.190794	1.978757	2.605967	0.683509
# 수치형 자료들을 요약해서 보여줍니다.
df.describe()
W	X	Y	Z
count	5.000000	5.000000	5.000000	5.000000
mean	0.343858	0.453764	0.452287	0.431871
std	1.681131	1.061385	1.454516	0.594708
min	-2.018168	-0.758872	-0.933237	-0.589001
25%	0.188695	-0.319318	-0.848077	0.503826
50%	0.190794	0.628133	0.528813	0.605965
75%	0.651118	0.740122	0.907969	0.683509
max	2.706850	1.978757	2.605967	0.955057
# 각각의 타입을 확인할 수 있습니다.
df.dtypes
W    float64
X    float64
Y    float64
Z    float64
dtype: object
# 결측치가 있는지, 타입이 무엇인지, 개수가 몇개인지 확인 할 수 있는 방법입니다.
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, CA to CO
Data columns (total 4 columns):
W    5 non-null float64
X    5 non-null float64
Y    5 non-null float64
Z    5 non-null float64
dtypes: float64(4)
memory usage: 200.0+ bytes

이것 이외에도 판다스는 무수히 많은 내용들이 있습니다.

 

이 중에서는 데이터프레임을 어떻게 만드는지! loc와 iloc 사용 방법!!!!!!

알아두시면 좋을 것 같습니다.

dataframe.ipynb
0.03MB
series.ipynb
0.01MB

 

지금까지 좀 부여주기 위해서 결과와 같이 보여줬지만 추후에는 코드만 보여주려고 합니다.

필요한 결과 값은 스크린샷 사진으로 올리도록 하겠습니다!

 

저도 아직 배우고 사용하는 단계이기에 잘못된 부분이 있다면 언제든지 댓글 남겨주시면 감사하겠습니다.