Pandas
1. Pandas DataFrame and Operations
# pandas 라이브러리를 불러오자. pd를 약칭으로 사용
import pandas as pd
import numpy as np
- DataFrame은 2차원 테이블이고, 테이블의 한 줄(행/열)을 Series라고 함
- Series의 모임이 곧, DataFrame
# s는 1, 3, 5, np.nan, 6, 8을 원소로 가지는 pandas.Series를 만들자.
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
# nan이 float로 인식, 판다스에서는 한 줄에 같은 데이터 타입, 정수대신 전부 실수로 인식.
# 12x4 행렬에 1부터 48까지의 숫자를 원소를 가지고,
index는 0부터 시작하고, coulmns은 순서대로 X1, X2, X3, X4로 하는 DataFrame 생성
cf) 행렬 헷갈릴때, 행거-가로 열쇠-세로로 외우면 편함!
df = pd.DataFrame(data= np.arange(1,49).reshape(12,4)
,index = np.arange(12),
columns=["X1", "X2", "X3, "X4"])
df
X1 X2 X3 X4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 20
5 21 22 23 24
6 25 26 27 28
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
10 41 42 43 44
11 45 46 47 48
# dataframe index를 확인해보자
df.index
>> Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype='int64')
# dataframe columns를 확인해보자
# dtype='object' 쉽게 생각하면 스트링처럼 생각하면된다.
df.columns
>>> ndex(['X1', 'X2', 'X3', 'X4'], dtype='object')
# dataframe values를 확인해보자
df.values
>> array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24],
[25, 26, 27, 28],
[29, 30, 31, 32],
[33, 34, 35, 36],
[37, 38, 39, 40],
[41, 42, 43, 44],
[45, 46, 47, 48]])
# 특정 column을 가져오기
df["X2"]
>>> 0 2
1 6
2 10
3 14
4 18
5 22
6 26
7 30
8 34
9 38
10 42
11 46
Name: X2, dtype: int32
# X1 column에 2 더하기
# df["X1"] = df["X1"]+2 --> 오버 라이트 하면됨
df["X1"] + 2
>>> 0 3
1 7
2 11
3 15
4 19
5 23
6 27
7 31
8 35
9 39
10 43
11 47
Name: X1, dtype: int32
df
>>
X1 X2 X3 X4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 20
5 21 22 23 24
6 25 26 27 28
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
10 41 42 43 44
11 45 46 47 48
# df[ "X1" ]+2 저장하지 않으면 원래 값으로 나온다!
2.2. Dataframe 기초 method
# dataframe의 맨 위 다섯줄을 보여주는 head()
# 위에서 5줄
df.head()
X1 X2 X3 X4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 20
# 맨 아래 다섯줄은 tail()
df.tail()
X1 X2 X3 X4
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
10 41 42 43 44
11 45 46 47 48
# 맨 위로 부터 10줄을 보고 싶으면?
df.head(10)
X1 X2 X3 X4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 20
5 21 22 23 24
6 25 26 27 28
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
# dataframe에 대한 전체적인 요약정보를 보여주는 함수 info()
# index, columns, null/not-null/dtype/memory usage가 표시됨
# Non-Null Count 결측치가 아닌것
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 int32
1 X2 12 non-null int32
2 X3 12 non-null int32
3 X4 12 non-null int32
dtypes: int32(4)
memory usage: 288.0 bytes
# dataframe에 대한 전체적인 통계정보를 보여주는 함수 df.describe()
# count 횟수
# mean 평균
# std 표준편차
# min 최저값
# 25 50 75 4분위값
# max 최대값
df.describe()
# X2 column를 기준으로 내림차순 정렬을 해보자
# 오름차순은 sort( by: "열 이름" ) , 내림차순은 sort( by: "열 이름", ascending = False )
df.sort_values(by='X2', ascending=False )
# X2만 되는게 아니고 모든 열이 정렬이 된다.
2.3. Fancy Indexing !
- 데이터를 filtering <=> Search !
- 전체 데이터에서 원하는 일부의 데이터를 찾아오는 방법 !
# pandas dataframe은 column 이름을 이용하여 기본적인 Indexing이 가능
# X1 column을 indexing
# df ["X1"] = df. X1
# 둘다 되지만 . 이 편함 하지만 특정 column 이름이 "Kim Yong Dam" df.Kim Yong Dam은 안됨!
df.X1
0 1
1 5
2 9
3 13
4 17
5 21
6 25
7 29
8 33
9 37
10 41
11 45
Name: X1, dtype: int32
# dataframe에서 slicing을 이용하면 row 단위로 잘려나옴
# 앞에서 3줄을 slicing
df[ : 3 ]
X1 X2 X3 X4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
# df에서 index value를 기준으로 indexing도 가능 (여전히 row 단위)
# 인덱스의 가장 첫번째 인덱스 = 0
df.index[ 0 ]
>>> 0 ---> 인덱스의 가장 첫번째 인덱스 = 0
# df.loc는 특정값을 기준으로 indexing (key - value)
# 인덱스에 포함되는 데이터 row를 뽑음
df.loc[0]
X1 1
X2 2
X3 3
X4 4
Name: 0, dtype: int32
# 이쯤되면 df에 무엇이 있었는지 기억이 안나니 다시 출력해보자
df
X1 X2 X3 X4
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 20
5 21 22 23 24
6 25 26 27 28
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
10 41 42 43 44
11 45 46 47 48
# df.loc에 2차원 indexing도 가능
# [index, "열이름"]
df.loc[0,"X2"]
>>> 2
df.loc[9,"X4"]
>>> 40
# 만약 df.loc[ 3 : 5, [ "X1", "X2" ] ] 이면 5가 포함되나? ----> 된다!
# 3:5 에서 ~번째로 인덱싱 하는게 아니라, 인덱스 벨류를 기준으로 하는거기 때문에 5가 포함된다!
df.loc[3:5 , ["X1","X2"]]
X1 X2
3 13 14
4 17 18
5 21 22
df.loc[3:5 , "X2":"X4"]
X2 X3 X4
3 14 15 16
4 18 19 20
5 22 23 24
df.loc[[0,1,4,6,10],["X1","X4"]]
X1 X4
0 1 4
1 5 8
4 17 20
6 25 28
10 41 44
# dataframe에 조건식을 적용해주면 조건에 만족하는지 여부를 알려주는 "mask"가 생긴다!
# Q. df에서 X3 column에 있는 원소들중에 3의 배수만 출력!
df['X3'] % 3 == 0 <---- mask가 만들어짐
0 True
1 False
2 False
3 True
4 False
5 False
6 True
7 False
8 False
9 True
10 False
11 False
Name: X3, dtype: bool
df[df["X3"] % 3 == 0]
X1 X2 X3 X4
0 1 2 3 4
3 13 14 15 16
6 25 26 27 28
9 37 38 39 40
# df에서 X3열에 있는 원소들 중 20보다 큰 데이터를 포함하는 모든 로우를 뽑자!
df["X3"] > 20 <--- mask
df[df["X3"] > 20]
X1 X2 X3 X4
5 21 22 23 24
6 25 26 27 28
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
10 41 42 43 44
11 45 46 47 48
# iloc[ ] : integer-location based indexing
# 2차원 리스트 indexing과 같은 원리
df.iloc[5]
X1 21
X2 22
X3 23
X4 24
Name: 5, dtype: int32
# iloc로 2차원 indexing을 하게되면, row 기준으로 index 3,4 를 가져오고 column 기준으로 0, 1을 가져옴!
# df.loc[[3,4],[0,1]] 열값을 "X0","X1" 로 표시해야함
df.iloc[[3,4],[0,1]]
X1 X2
3 13 14
4 17 18
# Q. 2차원 indexing에 뒤에가 : 면 어떤 의미?
df.loc[ 3 : 10 , : ] # 모든 column
df.loc[ : , "X1" :"X2" ] # 모든 row, X1, X2 열
df.iloc[ : , 0 : 1 ] # X2 column 포함안됨
df.iloc[ 0 : 3 , 0 : 2 ] # row, column 전부 iloc에서는 마지막 자리수 빠진다
df.loc[3:10, : ]
>>>
X1 X2 X3 X4
3 13 14 15 16
4 17 18 19 20
5 21 22 23 24
6 25 26 27 28
7 29 30 31 32
8 33 34 35 36
9 37 38 39 40
10 41 42 43 44
df.loc[ : , "X1":"X2"]
>>>
X1 X2
0 1 2
1 5 6
2 9 10
3 13 14
4 17 18
5 21 22
6 25 26
7 29 30
8 33 34
9 37 38
10 41 42
11 45 46
df.iloc[ : , 0 : 1] # X2 column 포함안됨
>>>
X1
0 1
1 5
2 9
3 13
4 17
5 21
6 25
7 29
8 33
9 37
10 41
11 45
df.iloc[0:3, 0:2 ] # row, column 전부 iloc에서는 마지막 자리수 빠진다
>>>
X1 X2
0 1 2
1 5 6
2 9 10
2.3. 여러 DataFrame 합치기
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])
df1
>>>
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df2
>>>
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
df3
>>>
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
pandas.merge()
pd.merge는 공통의 열을 기준으로 두 데이터프레임을 합쳐준다. sql에서 join과 같은 역할이다.
# 기준열 이름이 같을 때
pd.merge(left, right, on = '기준열', how = '조인방식')
# 기준열 이름이 다를 때
pd.merge(left, right, left_on = '왼쪽 열', right_on = '오른쪽 열', how = '조인방식')
left : 왼쪽 데이터프레임
right : 오른쪽 데이터프레임
on : (두 데이터프레임의 기준열 이름이 같을 때) 기준열
how : 조인 방식 {'left', 'right', 'inner', 'outer'} 기본값은 'inner'
left_on : 기준열 이름이 다를 때, 왼쪽 기준열
right_on : 기준열 이름이 다를 때, 오른쪽 기준열
# pd.merge( df1, df2 , on ="A" )
# 디폴트 how= inner라 겹치는 것이 아무것도 없으므로, 아무것도 나오지 않는다.
pd.merge(df1, df2 , on ="A")
>>>
A B_x C_x D_x B_y C_y D_y
# pd.merge(df1, df2 , on ="A", how = "outer")
# 합집합 개념, A는 다 들어감 왼쪽 데이터프레임과 오른쪽 데이터프레임에 없는 값들은 NaN으로 나타난다.
pd.merge(df1, df2 , on ="A", how = "outer")
>>>
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 NaN NaN NaN
2 A2 B2 C2 D2 NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN
4 A4 NaN NaN NaN B4 C4 D4
5 A5 NaN NaN NaN B5 C5 D5
6 A6 NaN NaN NaN B6 C6 D6
7 A7 NaN NaN NaN B7 C7 D7
# left join
pd.merge(df2, df3, on="A", how="left")
# 겹치는게 없어서 안나옴
# 왼쪽 데이터프레임을 기준으로 조인한다.
# 오른쪽 데이터프레임에 없는 값은 NaN으로 나타난다.
pd.merge(df2, df3, on="A", how="left")
>>>
A B_x C_x D_x B_y C_y D_y
0 A4 B4 C4 D4 NaN NaN NaN
1 A5 B5 C5 D5 NaN NaN NaN
2 A6 B6 C6 D6 NaN NaN NaN
3 A7 B7 C7 D7 NaN NaN NaN
# right join
# pd.merge(df1, df2, on="A", how="right")
# 오른쪽 데이터프레임을 기준으로 조인한다.
# 왼쪽 데이터프레임에 없는 값은 NaN으로 나타난다.
pd.merge(df1, df2, on="A", how="right")
>>>
B_x C_x D_x B_y C_y D_y
0 A4 NaN NaN NaN B4 C4 D4
1 A5 NaN NaN NaN B5 C5 D5
2 A6 NaN NaN NaN B6 C6 D6
3 A7 NaN NaN NaN B7 C7 D7
pandas.concat( )
데이터프레임을 위/아래(행 기준)로 합치거나 옆으로(열 기준)으로 합치기 위해서는 pd.concat을 사용하면 된다.
# 위/아래로 합치기 - 행 기준
pd.concat( [ df1, df2] , axis = 0 )
# 옆으로 합치기 - 열 기준
pd.concat( [ df1, df2 ], axis = 1 )
# axis = 0
행 기준
동일한 column명을 기준으로 데이터프레임이 위/아래로 쌓아진다.
디폴트 값이다.
# axis = 1
열 기준
데이터프레임이 옆으로 붙는다.
pd.concat([df1 ,df2 ,df3])
>>>
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
# pd.concat( [ df1 ,df2 ,df3 ] , axis=1 )
# 인덱스 value가 틀려서 난장판이됨
pd.concat([df1 ,df2 ,df3],axis=1)
>>>
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
# df1, df2, df3의 인덱스를 같게 바꾸자
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=[0, 1, 2, 3])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[0, 1, 2, 3])
# 인덱스가 같아서 결과가 깔끔해짐 열이 추가됨
pd.concat([df1 ,df2 ,df3],axis=1)
>>>
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
# .reset_index( ) # 인덱스가 세로 만들어지면서 나옴
pd.concat([df1 ,df2 ,df3],axis=0).reset_index()
>>>
index A B C D
0 0 A0 B0 C0 D0
1 1 A1 B1 C1 D1
2 2 A2 B2 C2 D2
3 3 A3 B3 C3 D3
4 4 A0 B4 C4 D4
5 5 A1 B5 C5 D5
6 6 A2 B6 C6 D6
7 7 A3 B7 C7 D7
8 8 A8 B8 C8 D8
9 9 A9 B9 C9 D9
10 10 A10 B10 C10 D10
11 11 A11 B11 C11 D11
# .reset_index(drop=True) # drop=True 추가하면 기존의 인덱스는 버림
pd.concat([df1 ,df2 ,df3],axis=0).reset_index(drop=True)
>>>
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
2.4 DataFrame으로 데이터 불러오기
Source : https://www.kaggle.com/c/titanic/data
pd.read_csv("파일 경로/titanic/train.csv")
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 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
# train.csv 파일 불러오기
titanic = pd.read_csv( "파일경로titanic/train.csv" )
titanic.shape : 행과 열 확인
titanic.shape
>>> (891, 12)
# info( ) 정보확인 가능
titanic.info()
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
# dataframe에 대한 전체적인 통계정보를 보여주는 함수 df.describe()를 적용해보자
# 콜럼이 12개인데 왜 7개지?, object컬럼은 통계량은 구하기 힘듬
# numerical 데이터만 구할 수 있음, 오브젝트만 있으면 또 따로 나옴
titanic.describe()
>>>
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
# .value_counts( ) 각 벨류별 몇개씩 있는지
titanic["Pclass"].value_counts()
>>>
3 491
1 216
2 184
Name: Pclass, dtype: int64
# isnull( ) 특정 컬럼에 null이 어디에 있는지 확인 가능
titanic.Age.isnull() ---> mask
>>>
0 False
1 False
2 False
3 False
4 False
...
886 False
887 False
888 True
889 False
890 False
Name: Age, Length: 891, dtype: bool
# titanic[ titanic.Age.isnull( ) ] age가 null인 사람의 행을 뽑아라
titanic.Age.isnull()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
17 | 18 | 1 | 2 | Williams, Mr. Charles Eugene | male | NaN | 0 | 0 | 244373 | 13.0000 | NaN | S |
19 | 20 | 1 | 3 | Masselmani, Mrs. Fatima | female | NaN | 0 | 0 | 2649 | 7.2250 | NaN | C |
26 | 27 | 0 | 3 | Emir, Mr. Farred Chehab | male | NaN | 0 | 0 | 2631 | 7.2250 | NaN | C |
28 | 29 | 1 | 3 | O'Dwyer, Miss. Ellen "Nellie" | female | NaN | 0 | 0 | 330959 | 7.8792 | NaN | Q |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
859 | 860 | 0 | 3 | Razi, Mr. Raihed | male | NaN | 0 | 0 | 2629 | 7.2292 | NaN | C |
863 | 864 | 0 | 3 | Sage, Miss. Dorothy Edith "Dolly" | female | NaN | 8 | 2 | CA. 2343 | 69.5500 | NaN | S |
868 | 869 | 0 | 3 | van Melkebeke, Mr. Philemon | male | NaN | 0 | 0 | 345777 | 9.5000 | NaN | S |
878 | 879 | 0 | 3 | Laleff, Mr. Kristo | male | NaN | 0 | 0 | 349217 | 7.8958 | NaN | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
177 rows × 12 columns
# titanic.loc[ 0 : 100 , "Name" ]
# Length: 101-> loc는 마지막 포함
titanic.loc[0:100,"Name"]
>>>
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
...
96 Goldschmidt, Mr. George B
97 Greenfield, Mr. William Bertram
98 Doling, Mrs. John T (Ada Julia Bone)
99 Kantor, Mr. Sinai
100 Petranec, Miss. Matilda
Name: Name, Length: 101, dtype: object
# titanic.loc[ 0 : 100 , "PassengerId" : "Age" ]
titanic.loc[0:100,"PassengerId":"Age"]
# titanic.iloc[100 : 200 , : 3 ]
titanic.iloc[100:200, :3]
# 30살 이상인 사람들의 요금은 얼마일까?
# titanic[ titanic.Age > 30 ][ "Fare" ]
titanic[titanic.Age > 30]["Fare"]
1 71.2833
3 53.1000
4 8.0500
6 51.8625
11 26.5500
...
873 9.0000
879 83.1583
881 7.8958
885 29.1250
890 7.7500
Name: Fare, Length: 305, dtype: float64
# 판다스는 loc를 사용하도록 권장 깔끔& 빠름
# titanic.loc[ titanic.Age > 30, " Fare " ]
titanic.loc[titanic.Age>30, "Fare"]
1 71.2833
3 53.1000
4 8.0500
6 51.8625
11 26.5500
...
873 9.0000
879 83.1583
881 7.8958
885 29.1250
890 7.7500
Name: Fare, Length: 305, dtype: float64
# titanic.loc[ titanic.Age > 30, "Fare" ].mean( )
titanic.loc[titanic.Age>30, "Fare"].mean()
>>>
42.35290983606555
2.5. Pivot Table을 이용하여 데이터 살펴보기
- pivot table이란 기존 테이블 구조를 특정 column을 기준으로 재구조화한 테이블을 말합니다.
- 특정 column을 기준으로 pivot하기 때문에,
- 어떤 column에 어떤 연산을 하느냐에 따라서 만들어지는 결과가 바뀝니다.
- 주로 어떤 column을 기준으로 데이터를 해석하고 싶을 때 사용합니다.
- pd. pivot_table(df , values = , index = , columns = , values = , aggfunc = )
# 성별을 기준으로 생존률 파악 --> Mean vs Sum
pd.pivot_table( data = titanic, index = [ "Sex" ], values = [ "Survived" ] )
# Sex column을 기준으로 테이블이 재구조화 되었다!
# 남성과 여성의 생존율의 평균을 구했다.
pd.pivot_table(data=titanic, index=["Sex"], values=["Survived"])
>>>
Sex Survived
female 0.742038
male 0.188908
# count는 survived의 갯수, mean은 평균, sum은 합계
pd.pivot_table(data=titanic, index=["Sex"], values=["Survived"], aggfunc=["sum","mean","count"])
# 사회 계급을 기준으로 생존률 파악
# pd.pivot_table( data = titanic, index = ["Pclass"] , values = ["Survived"] )
pd.pivot_table(data=titanic, index=["Pclass"],values=["Survived"] )
# pd.pivot_table(data=titanic, index=["Pclass"],values=["Survived"], aggfunc=["sum","mean","count"] )
pd.pivot_table(data=titanic, index=["Pclass"],values=["Survived"], aggfunc=["sum","mean","count"] )
# 1등석에 여성의 비율은 얼마일까?
pd.pivot_table( data=titanic, index = [ "Pclass" , "Sex" ], values = [ "Survived" ] ,aggfunc=[ "mean" , "count" ] )
pd.pivot_table( data=titanic, index = [ "Pclass" , "Sex" ], values = [ "Survived" ] ,aggfunc=[ "mean" , "count" ] )
'Python > Data Analysis Library' 카테고리의 다른 글
Part03 Chapter.02 데이터 분석 라이브러리 08 pyplot 기초 (실습) (0) | 2022.07.24 |
---|---|
Part03 Chapter.02 데이터 분석 라이브러리 07. Seaborn을 사용하는 이유 (0) | 2022.07.18 |
Part03 Chapter.02 데이터 분석 라이브러리 05. Pandas DataFrame (0) | 2022.07.18 |
Part03 Chapter.02 데이터 분석 라이브러리 04. Pandas를 사용하는 이유 (0) | 2022.07.18 |
Part03 Chapter.02 데이터 분석 라이브러리-03. Numpy method (실습) (0) | 2022.07.12 |