본문 바로가기

Python/Data Analysis Library

Part03 Chapter.02 데이터 분석 라이브러리 06. Pandas method (실습)

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 : 기준열 이름이 다를 때, 오른쪽 기준열

https://mizykk.tistory.com/82

 

 

# 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" ] )