오늘 할 일: 갈고 닦기
pandas_tutorial-1

Pandas tutorial 1 - 데이터 만들기부터 조회까지

tidy data란

데이터 분석을 위해선 정돈된 형태의 데이터를 구축해 놓는 것이 필수적이죠. 타이디(tidy, 깔끔한) 데이터는 작업하기 매우 용이한, 정형화된 형태의 데이터로, 다음을 만족해야 합니다.

  1. 각 관측값마다 해당되는 행이 있어야하고,
  2. 각 변수마다 해당되는 열이 있어야하고,
  3. 값마다 해당하는 하나의 셀이 있어야 합니다.

일반적으로 엑셀에 데이터를 입력하는 방식과 동일하다고 생각하시면 됩니다. 예를 들어, 어떤 학급에서 학생들이 시험을 치루었고, 그 성적을 입력한다고 합시다. 각 열은 해당 학급에 속하는 학생의 번호, 이름, 국어점수, 수학점수, 영어점수를 의미하고, 각 행은 한명의 학생에 대한 관측값 즉 해당 학생의 번호, 이름, 국어점수, 수학점수, 영어점수를 포함할 것입니다. Pandas에서는 이러한 타이디 데이터를 데이터프레임 타입으로 다루며, 이를 가공하는 각종 함수를 제공합니다.

In [1]:
# 라이브러리 불러오기
import pandas as pd

데이터 프레임 만들기

In [2]:
grades = pd.DataFrame(
                 {'Math'     : [80, 89, 93, 66, 84, 85, 74, 64],
                  'Science'  : [94, 76, 88, 78, 88, 92, 60, 85],
                  'English'  : [83, 76, 93, 96, 77, 85, 92, 60],
                  'History'  : [96, 66, 76, 85, 78, 88, 69, 99]})
grades
Out[2]:
Math Science English History
0 80 94 83 96
1 89 76 76 66
2 93 88 93 76
3 66 78 96 85
4 84 88 77 78
5 85 92 85 88
6 74 60 92 69
7 64 85 60 99

각 열마다 관측값들을 정의함으로써 시험을 치룬 과목과 각 과목마다의 점수를 담은 데이터 프레임을 생성합니다. 열의 이름과 열에 속하는 관측값은 딕셔너리 구조의 key-value와 닮아있습니다.

In [4]:
grades_new = pd.DataFrame(
                          [[80, 94, 83, 96], [89, 76, 76, 66], [93, 88, 93, 76]],
                          columns=['Math', 'Science', 'English','History'])
grades_new
Out[4]:
Math Science English History
0 80 94 83 96
1 89 76 76 66
2 93 88 93 76

각 행이 갖는 관측값을 먼저 정의한 후, 열의 이름을 명시하여 데이터를 만들 수도 있습니다.

In [5]:
grades.head()  # 처음 다섯 개의 행을 보여줍니다.
Out[5]:
Math Science English History
0 80 94 83 96
1 89 76 76 66
2 93 88 93 76
3 66 78 96 85
4 84 88 77 78
In [6]:
grades.head(n = 3) # 매개변수 n을 지정하여 원하는 만큼 볼 수도 있습니다.
Out[6]:
Math Science English History
0 80 94 83 96
1 89 76 76 66
2 93 88 93 76

tail

In [7]:
grades.tail() # 마지막 다섯 개의 행을 보여줍니다.
Out[7]:
Math Science English History
3 66 78 96 85
4 84 88 77 78
5 85 92 85 88
6 74 60 92 69
7 64 85 60 99
In [8]:
grades.tail(n = 3)
Out[8]:
Math Science English History
5 85 92 85 88
6 74 60 92 69
7 64 85 60 99

columns : 칼럼명 조회

In [9]:
grades.columns
Out[9]:
Index(['Math', 'Science', 'English', 'History'], dtype='object')

shape : 데이터 프레임의 차원 조회

데이터 프레임의 행과 열의 개수를 튜플 형태로 반환합니다.

In [20]:
grades.shape 
Out[20]:
(8, 4)

info

데이터 프레임이 갖는 열의 정보를 조회합니다. 여기서는 모두 정수를 입력하여 int인 것을 확인할 수 있습니다.

In [10]:
grades.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype
---  ------   --------------  -----
 0   Math     8 non-null      int64
 1   Science  8 non-null      int64
 2   English  8 non-null      int64
 3   History  8 non-null      int64
dtypes: int64(4)
memory usage: 384.0 bytes

subsetting columns

열이 갖는 관측값을 시리즈(일종의 리스트) 타입으로 조회합니다.

In [13]:
grades['Math']
Out[13]:
0    80
1    89
2    93
3    66
4    84
5    85
6    74
7    64
Name: Math, dtype: int64
In [14]:
type(grades['Math'])
Out[14]:
pandas.core.series.Series

열이 갖는 관측값을 데이터프레임 타입으로 조회합니다.

In [16]:
grades[['Math']]
Out[16]:
Math
0 80
1 89
2 93
3 66
4 84
5 85
6 74
7 64
In [18]:
type(grades[['Math']])
Out[18]:
pandas.core.frame.DataFrame
In [26]:
grades[['Math', 'English']]
Out[26]:
Math English
0 80 83
1 89 76
2 93 93
3 66 96
4 84 77
5 85 85
6 74 92
7 64 60

index subsetting :인덱스를 사용하는 경우

In [20]:
grades.iloc[0]           # 첫번째 행을 시리즈 타입으로 조회
Out[20]:
Math       80
Science    94
English    83
History    96
Name: 0, dtype: int64
In [21]:
grades.iloc[[0]]         # 첫번째 행을 데이터프레임 타입으로 조회
Out[21]:
Math Science English History
0 80 94 83 96
In [22]:
grades.iloc[:, 1]        # 두번째 열의 모든 행
Out[22]:
0    94
1    76
2    88
3    78
4    88
5    92
6    60
7    85
Name: Science, dtype: int64
In [23]:
grades.iloc[3, 1]        # 두번째 열의 네번째 행에 해당하는 값
Out[23]:
78
In [24]:
grades.iloc[[1,3], :]    # 모든 열의 두번째, 네번째 행
Out[24]:
Math Science English History
1 89 76 76 66
3 66 78 96 85
In [25]:
grades.iloc[:, 1:3]      # 두번째, 세번째 열의 모든 행
Out[25]:
Science English
0 94 83
1 76 76
2 88 93
3 78 96
4 88 77
5 92 85
6 60 92
7 85 60
In [19]:
grades.iloc[4:, :3]      # 첫번째 열부터 세번째 열까지, 다섯번째 행부터 끝까지
Out[19]:
Math Science English
4 84 88 77
5 85 92 85
6 74 60 92
7 64 85 60

location subsetting : 칼럼명을 사용하는 경우

In [26]:
grades.loc[:, 'Math']                  # Math 열의 모든 행
Out[26]:
0    80
1    89
2    93
3    66
4    84
5    85
6    74
7    64
Name: Math, dtype: int64
In [27]:
grades.loc[2:3, ['Math', 'English']]   # Math and English 열의 3, 4번째 행
Out[27]:
Math English
2 93 93
3 66 96
In [28]:
grades.loc[4:, 'Math': 'English']      # Math열 부터 English열까지 5행 이후의 모든 행
Out[28]:
Math Science English
4 84 88 77
5 85 92 85
6 74 60 92
7 64 85 60
In [29]:
grades.loc[:5, 'Science': ]            # Science열 이후 모든 열에 대해 6행 이전의 모든 행
Out[29]:
Science English History
0 94 83 96
1 76 76 66
2 88 93 76
3 78 96 85
4 88 77 78
5 92 85 88

boolean indexing : 논리형 인덱싱, 서브세팅

In [30]:
grades[grades['Math'] > 80]             # Math가 80을 넘는 행을 조회
Out[30]:
Math Science English History
1 89 76 76 66
2 93 88 93 76
4 84 88 77 78
5 85 92 85 88
In [31]:
grades[grades['Math'] > 80]['Science']  # Math가 80을 넘는 행에서 Science의 값만 조회 
Out[31]:
1    76
2    88
4    88
5    92
Name: Science, dtype: int64
In [32]:
grades[grades['Math'] > 80].iloc[:, 3]  # Math가 80을 넘는 행을 담은 데이터 프레임의 4번째 열(History)을 조회
Out[32]:
1    66
2    76
4    78
5    88
Name: History, dtype: int64
In [33]:
grades[(grades['Math'] > 80) & (grades['Science'] < 80)] # Math가 80 초과이고 Science가 80 미만인 행 조회
Out[33]:
Math Science English History
1 89 76 76 66
In [34]:
grades[(grades['Math'] > 80) | (grades['Science'] < 80)]['History'] # Math가 80 초과이거나 Science가 80 미만인 행의 History 값 조회
Out[34]:
1    66
2    76
3    85
4    78
5    88
6    69
Name: History, dtype: int64


참고자료
https://towardsdatascience.com/pandas-cheat-sheet-4c4eb6802a4b
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf