Pandas¶
In [ ]:
# pandas 라이브러리 import
import pandas as pd
In [ ]:
pd.__version__
Out[ ]:
'2.2.1'
pandas v1 vs v2¶
- 현업에서 가장 많이 사용하는 pandas 버전은 1.5.3
- v1 에서는 numpy 모듈을 사용하는데 문제가 없음
- v2 에서는 numpy 모듈을 들어내서 numpy 종속 모듈에 영향을 미쳐 호환성에 문제가 있음
In [ ]:
%pip install pandas==1.5.3
Collecting pandas==1.5.3
Downloading pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl.metadata (11 kB)
Requirement already satisfied: python-dateutil>=2.8.1 in /Users/choiyoonseol/miniconda3/envs/upstage-ai-lab/lib/python3.11/site-packages (from pandas==1.5.3) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /Users/choiyoonseol/miniconda3/envs/upstage-ai-lab/lib/python3.11/site-packages (from pandas==1.5.3) (2024.1)
Requirement already satisfied: numpy>=1.21.0 in /Users/choiyoonseol/miniconda3/envs/upstage-ai-lab/lib/python3.11/site-packages (from pandas==1.5.3) (1.26.4)
Requirement already satisfied: six>=1.5 in /Users/choiyoonseol/miniconda3/envs/upstage-ai-lab/lib/python3.11/site-packages (from python-dateutil>=2.8.1->pandas==1.5.3) (1.16.0)
Downloading pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl (10.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.8/10.8 MB 3.8 MB/s eta 0:00:0000:0100:01
Installing collected packages: pandas
Attempting uninstall: pandas
Found existing installation: pandas 2.2.1
Uninstalling pandas-2.2.1:
Successfully uninstalled pandas-2.2.1
Successfully installed pandas-1.5.3
Note: you may need to restart the kernel to use updated packages.
In [ ]:
pd.__version__
Out[ ]:
'1.5.3'
1. Pandas DataFrame and Operations¶
- DataFrame은 2차원 테이블이고, 테이블의 한 줄(행/열)을 Series
- Series의 모임이 곧, DataFrame
In [ ]:
import numpy as np
In [ ]:
# 12x4 행렬에 1부터 36까지의 숫자를 원소를 가지고, index는 0부터 시작하고, coulmns은 순서대로 X1, X2, X3, X4로 하는 DataFrame 생성
np.random.seed(42)
df = pd.DataFrame(data=np.random.randn(12, 4),
index=np.arange(0, 12),
columns=['X1','X2','X3','X4'])
df
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
0 | 0.496714 | -0.138264 | 0.647689 | 1.523030 |
1 | -0.234153 | -0.234137 | 1.579213 | 0.767435 |
2 | -0.469474 | 0.542560 | -0.463418 | -0.465730 |
3 | 0.241962 | -1.913280 | -1.724918 | -0.562288 |
4 | -1.012831 | 0.314247 | -0.908024 | -1.412304 |
5 | 1.465649 | -0.225776 | 0.067528 | -1.424748 |
6 | -0.544383 | 0.110923 | -1.150994 | 0.375698 |
7 | -0.600639 | -0.291694 | -0.601707 | 1.852278 |
8 | -0.013497 | -1.057711 | 0.822545 | -1.220844 |
9 | 0.208864 | -1.959670 | -1.328186 | 0.196861 |
10 | 0.738467 | 0.171368 | -0.115648 | -0.301104 |
11 | -1.478522 | -0.719844 | -0.460639 | 1.057122 |
In [ ]:
# dataframe index
df.index
Out[ ]:
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype='int64')
In [ ]:
# dataframe columns
df.columns
Out[ ]:
Index(['X1', 'X2', 'X3', 'X4'], dtype='object')
In [ ]:
# dataframe values: DataFrame의 데이터를 numpy array로 가져옴
df.values
Out[ ]:
array([[ 0.49671415, -0.1382643 , 0.64768854, 1.52302986],
[-0.23415337, -0.23413696, 1.57921282, 0.76743473],
[-0.46947439, 0.54256004, -0.46341769, -0.46572975],
[ 0.24196227, -1.91328024, -1.72491783, -0.56228753],
[-1.01283112, 0.31424733, -0.90802408, -1.4123037 ],
[ 1.46564877, -0.2257763 , 0.0675282 , -1.42474819],
[-0.54438272, 0.11092259, -1.15099358, 0.37569802],
[-0.60063869, -0.29169375, -0.60170661, 1.85227818],
[-0.01349722, -1.05771093, 0.82254491, -1.22084365],
[ 0.2088636 , -1.95967012, -1.32818605, 0.19686124],
[ 0.73846658, 0.17136828, -0.11564828, -0.3011037 ],
[-1.47852199, -0.71984421, -0.46063877, 1.05712223]])
In [ ]:
# 특정 column을 가져오기
df['X1']
Out[ ]:
0 0.496714
1 -0.234153
2 -0.469474
3 0.241962
4 -1.012831
5 1.465649
6 -0.544383
7 -0.600639
8 -0.013497
9 0.208864
10 0.738467
11 -1.478522
Name: X1, dtype: float64
In [ ]:
# X1 column에 2 더하기
df['X1'] + 2
Out[ ]:
0 2.496714
1 1.765847
2 1.530526
3 2.241962
4 0.987169
5 3.465649
6 1.455617
7 1.399361
8 1.986503
9 2.208864
10 2.738467
11 0.521478
Name: X1, dtype: float64
2.2. Dataframe 기초 method¶
In [ ]:
# dataframe의 맨 위 다섯줄을 보여주는 head()
df.head()
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
0 | 0.496714 | -0.138264 | 0.647689 | 1.523030 |
1 | -0.234153 | -0.234137 | 1.579213 | 0.767435 |
2 | -0.469474 | 0.542560 | -0.463418 | -0.465730 |
3 | 0.241962 | -1.913280 | -1.724918 | -0.562288 |
4 | -1.012831 | 0.314247 | -0.908024 | -1.412304 |
In [ ]:
# 10줄
df.head(10)
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
0 | 0.496714 | -0.138264 | 0.647689 | 1.523030 |
1 | -0.234153 | -0.234137 | 1.579213 | 0.767435 |
2 | -0.469474 | 0.542560 | -0.463418 | -0.465730 |
3 | 0.241962 | -1.913280 | -1.724918 | -0.562288 |
4 | -1.012831 | 0.314247 | -0.908024 | -1.412304 |
5 | 1.465649 | -0.225776 | 0.067528 | -1.424748 |
6 | -0.544383 | 0.110923 | -1.150994 | 0.375698 |
7 | -0.600639 | -0.291694 | -0.601707 | 1.852278 |
8 | -0.013497 | -1.057711 | 0.822545 | -1.220844 |
9 | 0.208864 | -1.959670 | -1.328186 | 0.196861 |
In [ ]:
df.tail()
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
7 | -0.600639 | -0.291694 | -0.601707 | 1.852278 |
8 | -0.013497 | -1.057711 | 0.822545 | -1.220844 |
9 | 0.208864 | -1.959670 | -1.328186 | 0.196861 |
10 | 0.738467 | 0.171368 | -0.115648 | -0.301104 |
11 | -1.478522 | -0.719844 | -0.460639 | 1.057122 |
In [ ]:
# dataframe에 대한 전체적인 요약정보
# index, columns, null/not-null/dtype/memory usage 표시
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 12 entries, 0 to 11
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 X1 12 non-null float64
1 X2 12 non-null float64
2 X3 12 non-null float64
3 X4 12 non-null float64
dtypes: float64(4)
memory usage: 480.0 bytes
In [ ]:
# dataframe에 대한 전체적인 통계정보
df.describe()
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
count | 12.000000 | 12.000000 | 12.000000 | 12.000000 |
mean | -0.100154 | -0.450107 | -0.303047 | 0.032117 |
std | 0.801497 | 0.817508 | 0.962175 | 1.118572 |
min | -1.478522 | -1.959670 | -1.724918 | -1.424748 |
25% | -0.558447 | -0.804311 | -0.968766 | -0.726927 |
50% | -0.123825 | -0.229957 | -0.462028 | -0.052121 |
75% | 0.305650 | 0.126034 | 0.212568 | 0.839857 |
max | 1.465649 | 0.542560 | 1.579213 | 1.852278 |
In [ ]:
# X2 column를 기준으로 내림차순 정렬 (판다스는 최소 단위가 row)
df.sort_values(by='X2', ascending=False)
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
2 | -0.469474 | 0.542560 | -0.463418 | -0.465730 |
4 | -1.012831 | 0.314247 | -0.908024 | -1.412304 |
10 | 0.738467 | 0.171368 | -0.115648 | -0.301104 |
6 | -0.544383 | 0.110923 | -1.150994 | 0.375698 |
0 | 0.496714 | -0.138264 | 0.647689 | 1.523030 |
5 | 1.465649 | -0.225776 | 0.067528 | -1.424748 |
1 | -0.234153 | -0.234137 | 1.579213 | 0.767435 |
7 | -0.600639 | -0.291694 | -0.601707 | 1.852278 |
11 | -1.478522 | -0.719844 | -0.460639 | 1.057122 |
8 | -0.013497 | -1.057711 | 0.822545 | -1.220844 |
3 | 0.241962 | -1.913280 | -1.724918 | -0.562288 |
9 | 0.208864 | -1.959670 | -1.328186 | 0.196861 |
2.3. Fancy Indexing !¶
- 데이터를 filtering <=> Search !
- 전체 데이터에서 원하는 일부의 데이터를 찾아오는 방법 !
In [ ]:
# pandas dataframe은 column 이름을 이용하여 기본적인 Indexing이 가능
# X1 column을 indexing
df['X1']
Out[ ]:
0 0.496714
1 -0.234153
2 -0.469474
3 0.241962
4 -1.012831
5 1.465649
6 -0.544383
7 -0.600639
8 -0.013497
9 0.208864
10 0.738467
11 -1.478522
Name: X1, dtype: float64
In [ ]:
# dataframe에서 slicing을 이용하면 row 단위로 잘려나옴
# 앞에서 3줄을 slicing
df[0:3]
Out[ ]:
X1 | X2 | X3 | X4 | |
---|---|---|---|---|
0 | 0.496714 | -0.138264 | 0.647689 | 1.523030 |
1 | -0.234153 | -0.234137 | 1.579213 | 0.767435 |
2 | -0.469474 | 0.542560 | -0.463418 | -0.465730 |
In [ ]:
# df에서 index value를 기준으로 indexing 가능 (여전히 row 단위)
df.loc[2]
Out[ ]:
X1 -0.469474
X2 0.542560
X3 -0.463418
X4 -0.465730
Name: 2, dtype: float64
In [ ]:
# df.loc는 특정값을 기준으로 indexing (key - value)
# df.loc[index, column]
df.loc[0, 'X1']
Out[ ]:
0.4967141530112327
In [ ]:
# df.loc에 2차원 indexing 가능
# 재배열 가능, indexing할 때 입력한 순서대로 데이터를 가져옴
df.loc[[0, 3], ['X1', 'X2']]
Out[ ]:
X1 | X2 | |
---|---|---|
0 | 0.496714 | -0.138264 |
3 | 0.241962 | -1.913280 |
In [ ]:
# dataframe에 조건식을 적용해주면 조건에 만족하는지 여부를 알려주는 "mask"가 생김
# boolean mask를 DataFrame에 indexing하면 True에 해당하는 row들이 추출됨
# boolean mask는 무조건 mask와 적용 대상의 index가 같아야함
mask = df['X3'] > 0 # boolean mask
df[mask]
# 첫번째 방법
df[mask]['X3']
# 두번째 방법(메모리 복사 방식으로 인해 판다스에서 추천하는 방법) df.loc[row에 대한 조건식, column에 대한 조건식]
df.loc[mask, 'X3']
Out[ ]:
0 0.647689
1 1.579213
5 0.067528
8 0.822545
Name: X3, dtype: float64
In [ ]:
# Q2. df에서 X1 column에 있는 원소들중에서 1보다 작은 원소들을 출력
df.loc[df['X1'] < 1, 'X1']
Out[ ]:
0 0.496714
1 -0.234153
2 -0.469474
3 0.241962
4 -1.012831
6 -0.544383
7 -0.600639
8 -0.013497
9 0.208864
10 0.738467
11 -1.478522
Name: X1, dtype: float64
In [ ]:
# 2차원 리스트 indexing과 같은 원리
# integer-location based indexing
df.iloc[0, 1]
Out[ ]:
-0.13826430117118466
In [ ]:
# iloc로 2차원 indexing을 하게되면, row 기준으로 index 3,4를 가져오고 column 기준으로 0, 1을 가져옴
df.iloc[[3, 4], [0, 1]]
Out[ ]:
X1 | X2 | |
---|---|---|
3 | 0.241962 | -1.913280 |
4 | -1.012831 | 0.314247 |
In [ ]:
# Q. 2차원 indexing에 뒤에가 : 면 어떤 의미?
df.iloc[:, 3]
Out[ ]:
0 1.523030
1 0.767435
2 -0.465730
3 -0.562288
4 -1.412304
5 -1.424748
6 0.375698
7 1.852278
8 -1.220844
9 0.196861
10 -0.301104
11 1.057122
Name: X4, dtype: float64
In [ ]:
df.iloc[0, :]
Out[ ]:
X1 0.496714
X2 -0.138264
X3 0.647689
X4 1.523030
Name: 0, dtype: float64
2.4. 여러 DataFrame 합치기¶
In [ ]:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
In [ ]:
df1
Out[ ]:
A | B | C | D | |
---|---|---|---|---|
0 | A0 | B0 | C0 | D0 |
1 | A1 | B1 | C1 | D1 |
2 | A2 | B2 | C2 | D2 |
3 | A3 | B3 | C3 | D3 |
In [ ]:
df2
Out[ ]:
A | B | C | D | |
---|---|---|---|---|
4 | A4 | B4 | C4 | D4 |
5 | A5 | B5 | C5 | D5 |
6 | A6 | B6 | C6 | D6 |
7 | A7 | B7 | C7 | D7 |
In [ ]:
df3
Out[ ]:
A | B | C | D | |
---|---|---|---|---|
8 | A8 | B8 | C8 | D8 |
9 | A9 | B9 | C9 | D9 |
10 | A10 | B10 | C10 | D10 |
11 | A11 | B11 | C11 | D11 |
pd.concat()¶
In [ ]:
# 위 아래로 합치기
pd.concat([df1, df2, df3])
Out[ ]:
A | B | C | D | |
---|---|---|---|---|
0 | A0 | B0 | C0 | D0 |
1 | A1 | B1 | C1 | D1 |
2 | A2 | B2 | C2 | D2 |
3 | A3 | B3 | C3 | D3 |
4 | A4 | B4 | C4 | D4 |
5 | A5 | B5 | C5 | D5 |
6 | A6 | B6 | C6 | D6 |
7 | A7 | B7 | C7 | D7 |
8 | A8 | B8 | C8 | D8 |
9 | A9 | B9 | C9 | D9 |
10 | A10 | B10 | C10 | D10 |
11 | A11 | B11 | C11 | D11 |
In [ ]:
pd.concat([df1, df2, df3], axis=1)
Out[ ]:
A | B | C | D | A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0 | B0 | C0 | D0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1 | A1 | B1 | C1 | D1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | A2 | B2 | C2 | D2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
3 | A3 | B3 | C3 | D3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | A4 | B4 | C4 | D4 | NaN | NaN | NaN | NaN |
5 | NaN | NaN | NaN | NaN | A5 | B5 | C5 | D5 | NaN | NaN | NaN | NaN |
6 | NaN | NaN | NaN | NaN | A6 | B6 | C6 | D6 | NaN | NaN | NaN | NaN |
7 | NaN | NaN | NaN | NaN | A7 | B7 | C7 | D7 | NaN | NaN | NaN | NaN |
8 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | A8 | B8 | C8 | D8 |
9 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | A9 | B9 | C9 | D9 |
10 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | A10 | B10 | C10 | D10 |
11 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | A11 | B11 | C11 | D11 |
In [ ]:
pd.concat([df1, df2.reset_index(drop=True), df3.reset_index(drop=True)], axis=1)
Out[ ]:
A | B | C | D | A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0 | B0 | C0 | D0 | A4 | B4 | C4 | D4 | A8 | B8 | C8 | D8 |
1 | A1 | B1 | C1 | D1 | A5 | B5 | C5 | D5 | A9 | B9 | C9 | D9 |
2 | A2 | B2 | C2 | D2 | A6 | B6 | C6 | D6 | A10 | B10 | C10 | D10 |
3 | A3 | B3 | C3 | D3 | A7 | B7 | C7 | D7 | A11 | B11 | C11 | D11 |
pd.merge(): SQL과 같이 join operation을 사용가능¶
In [ ]:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A1', 'A2'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C6', 'C7', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']})
In [ ]:
# A inner join b => table A와 table B의 특정 column에서 겹치는 값들을 기준으로 두 테이블을 합치는 연산
pd.merge(left=df1,
right=df2,
on='A',
how='inner')
Out[ ]:
A | B_x | C_x | D_x | B_y | C_y | D_y | |
---|---|---|---|---|---|---|---|
0 | A1 | B1 | C1 | D1 | B6 | C6 | D6 |
1 | A2 | B2 | C2 | D2 | B7 | C7 | D7 |
In [ ]:
pd.merge(left=df2, right=df3, on='C', how='inner')
Out[ ]:
A_x | B_x | C | D_x | A_y | B_y | D_y | |
---|---|---|---|---|---|---|---|
0 | A1 | B6 | C6 | D6 | A8 | B8 | D8 |
1 | A2 | B7 | C7 | D7 | A9 | B9 | D9 |
In [ ]:
# left join : left table(df1)을 기준으로 right table(df2)에서 on에 대해 겹치는 대상을 붙여주고 겹치지 않는 데이터는 NaN으로 추가.
pd.merge(left=df1, right=df2, on='A', how='left')
Out[ ]:
A | B_x | C_x | D_x | B_y | C_y | D_y | |
---|---|---|---|---|---|---|---|
0 | A0 | B0 | C0 | D0 | NaN | NaN | NaN |
1 | A1 | B1 | C1 | D1 | B6 | C6 | D6 |
2 | A2 | B2 | C2 | D2 | B7 | C7 | D7 |
3 | A3 | B3 | C3 | D3 | NaN | NaN | NaN |
In [ ]:
# 그냥 합치기 (concatenation)
2.5 DataFrame으로 데이터 불러오기¶
In [ ]:
# train.csv 파일 불러오기
titanic = pd.read_csv('./data/train.csv')
In [ ]:
titanic.head()
Out[ ]:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
In [ ]:
# Q1. 여성 승객들의 평균 나이를 구하기
titanic.loc[titanic['Sex'] == 'female', 'Age'].mean()
Out[ ]:
27.915708812260537
In [ ]:
np.mean(titanic.loc[titanic['Sex'] == 'female', 'Age'])
Out[ ]:
27.915708812260537
In [ ]:
# Q2. 1등석에 탑승한 승객 중 최대 요금을 낸 사람의 이름을 찾기
max_1st_fare = titanic.loc[titanic['Pclass'] == 1, 'Fare'].max()
titanic.loc[titanic['Fare'] == max_1st_fare, 'Name']
Out[ ]:
258 Ward, Miss. Anna
679 Cardeza, Mr. Thomas Drake Martinez
737 Lesurer, Mr. Gustave J
Name: Name, dtype: object
In [ ]:
pclass_1st_df = titanic.loc[titanic['Pclass'] == 1, ['Fare', 'Name']]
pclass_1st_df.loc[pclass_1st_df['Fare'] == pclass_1st_df['Fare'].max()]
Out[ ]:
Fare | Name | |
---|---|---|
258 | 512.3292 | Ward, Miss. Anna |
679 | 512.3292 | Cardeza, Mr. Thomas Drake Martinez |
737 | 512.3292 | Lesurer, Mr. Gustave J |
In [ ]:
# Q3. 1등석에 탑승한 승객 중 승선한 곳이 Queenstown인 사람들 의 수는?
queenstown_1st_df = titanic[(titanic['Pclass'] == 1) & (titanic['Embarked'] == 'Q')]
len(queenstown_1st_df)
Out[ ]:
2
In [ ]:
# Q4. 승선한 곳이 'S' 인 사람들의 생존자 수는?
titanic.loc[titanic['Embarked'].isin(['S']), 'Survived'].sum()
Out[ ]:
217
In [ ]:
# Q5. 미혼 여성 중에 나이를 모르는 사람의 수는?
titanic.loc[(titanic['Sex'] == 'female') & titanic['Name'].str.contains('Miss.'), 'Age'].isna().sum()
Out[ ]:
36
2.6. Pivot Table을 이용하여 데이터 살펴보기¶
- pivot table이란 기존 테이블 구조를 특정 column을 기준으로 재구조화한 테이블
- 특정 column을 기준으로 pivot하기 때문에, 어떤 column에 어떤 연산을 하느냐에 따라서 만들어지는 결과가 바뀜
- 주로 어떤 column을 기준으로 데이터를 해석하고 싶을 때 사용
In [ ]:
# 성별을 기준으로 생존률 파악 --> Mean vs Sum
pd.pivot_table(data=titanic, index='Sex', values='Survived', aggfunc=['count', 'sum', 'mean'])
Out[ ]:
count | sum | mean | |
---|---|---|---|
Survived | Survived | Survived | |
Sex | |||
female | 314 | 233 | 0.742038 |
male | 577 | 109 | 0.188908 |
In [ ]:
# 사회 계급을 기준으로 생존률 파악
pd.pivot_table(data=titanic, index='Pclass', values='Survived', aggfunc=['count', 'sum', 'mean'])
Out[ ]:
count | sum | mean | |
---|---|---|---|
Survived | Survived | Survived | |
Pclass | |||
1 | 216 | 136 | 0.629630 |
2 | 184 | 87 | 0.472826 |
3 | 491 | 119 | 0.242363 |
In [ ]:
pd.pivot_table(data=titanic, index=['Sex', 'Pclass'], values='Survived', aggfunc=['count', 'sum', 'mean'])
Out[ ]:
count | sum | mean | ||
---|---|---|---|---|
Survived | Survived | Survived | ||
Sex | Pclass | |||
female | 1 | 94 | 91 | 0.968085 |
2 | 76 | 70 | 0.921053 | |
3 | 144 | 72 | 0.500000 | |
male | 1 | 122 | 45 | 0.368852 |
2 | 108 | 17 | 0.157407 | |
3 | 347 | 47 | 0.135447 |
In [ ]:
pd.pivot_table(data=titanic, index=['Sex', 'Pclass'], values='Survived', aggfunc='mean').plot()
Out[ ]:
<Axes: xlabel='Sex,Pclass'>
In [ ]:
pd.pivot_table(data=titanic, index=['Sex', 'Pclass'], values='Survived', aggfunc='mean').plot(kind='bar')
Out[ ]:
<Axes: xlabel='Sex,Pclass'>
'Upstage AI Lab 3기' 카테고리의 다른 글
ML Regression 주가 예측 (0) | 2024.06.05 |
---|---|
코딩테스트를 위한 자료구조 및 알고리즘 개론 (0) | 2024.05.20 |
Python EDA - Numpy (0) | 2024.04.30 |
Linear Regression & Binary Classification (0) | 2024.04.30 |
Statistics - Correlation Analysis (0) | 2024.04.28 |