본문 바로가기

카테고리 없음

[패스트캠퍼스 수강 후기] 데이터분석 인강 100% 환급 챌린지 11회차 미션

16. ch02.pandas-전처리-01. 결측값 채우기(fillna) - 20. ch02.pandas-전처리-05. DataFrame 합치기 (merge)

16. ch02.pandas-전처리-01. 결측값 채우기(fillna)

1. 결측값을 채워주는 fillna

fillna(): na 값에 대하여 fill해주는 함수

df['키'].fillna(-1)
>0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
5 178.0
6 182.3
7 -1.0
8 179.2
9 167.1
10 -1.0
11 183.0
12 175.0
13 176.0
14 174.0
Name: 키, dtype: float64

df2 = df.copy()
df2
df2['키'].fillna(-1, inplace = True)
inplace=True 옵션을 주거나, fillna로 채워 준 값을 다시 대입
대입하고 덮어씌워줘.

fillna로 채워준 값 다시 대입하는 방법을 추천.

즉,
df2 = df.copy()
df2['키']
df2['키'] = df2['키'].fillna(-1)
df2['키']

평균값을 넣고 싶을 때
df2 = df.copy()
df2['키']
height = df2['키'].mean()
df2['키'] = df2['키'].fillna(height)
df2['키'] 확인


17. ch02.pandas-전처리-02. 결측값 제거(dropna), 중복 제거

2. 빈 칸이 있는 셀을 제거.


df.dropna()

행에 nan값이 있으면 아예 날려버림
dropna()는 몇가지 옵션을 추가 가능.

2-1. axis(열/행을 드랍)

axis=0 행을 드랍

df.dropna(axis=0)

axis=1 행을 드랍
df.dropna(axis=1)

2-2. how 옵션 - 'any' 한개라도 있는 경우 드랍. 'all' 모두 NaN인 경우 드랍

df.dropna()
df.dropna(axis=0, how = 'any')
두 값의 결과 동일
하나라도 비어있으면 드랍

df.dropna(axis=0, how = 'all')
전체가 비어있는 경우만 드랍



3. 중복된 값 제거 (drop_duplicates)

3-1. column의 중복값 제거

df['키']
>0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
5 178.0
6 182.3
7 NaN
8 179.2
9 167.1
10 NaN
11 183.0
12 175.0
13 176.0
14 174.0
Name: 키, dtype: float64

df['키'].drop_duplicates() 언더바 주의
>0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
6 182.3
7 NaN
8 179.2
9 167.1
11 183.0
12 175.0
13 176.0
14 174.0
Name: 키, dtype: float64

NaN값도 중복되었다고 봄. 첫번째 데이터 유지, 두번째부터 삭제.

keep 옵션으로 유지하고 싶은 데이터 선택 가능. keep :'first' / 'last'


df['키'].drop_duplicates(keep='last')

3-2. 행 전체 제거

df.drop_duplicates('그룹')


18. ch02.pandas-전처리-03. 결측값 제거(dropna) - 행과 열 제거 (drop)

4. Drop - column/row 제거하기

4-1. column 제거

drop() 활용하여 column 제거 axis=1

df.drop('그룹', axis=1)

복수의 column 제거 시 list로 지정

df.drop(['그룹','소속사'], axis=1)

4-2. row 제거

drop() 활용하여 row 제거 axis=0

df.drop(3, axis=0)

복수 row 제거 시 list로 지정
df.drop([3, 5], axis=0)


19. ch02.pandas-전처리-04. DataFrame 합치기 (concat)

1. DataFrame 합치기 (concat)

1-1. row 기준 합치기



1. import pandas as pd
2. df = pd.read_csv('https://bit.ly/ds-korean-idol')
df2 = pd.read_csv('https://bit.ly/ds-korean-idol-2')

3. df_copy = df.copy()
4. pd.concat([df, df_copy], sort = False)
row에 합할 때 pd.concat에 합칠 데이터프레임을 list로 합쳐줌.
sort=False 옵션 -> 순서가 유지

합하느라 index가 중간에 끊기는 현상.
reset_index() 로 인덱스를 초기화.

5. df_concat = pd.concat([df, df_copy], sort = False) 그 값을 df_concat에 넣어주고
6. df_concat.reset_index() 인덱스 초기화 순서 초기화

7. df_concat.reset_index(drop = True)
새로운 인덱스는 안만들어줘도 돼


1-2. column 기준으로 합치기

column 기준은 axis=1

pd.concat([df, df2], axis=1)

행의 갯수가 많지 않는 상태에서

df3 = df2.drop([3,5])
pd.concat([df, df3], axis=1)
>이름 그룹 소속사 성별 생년월일 키 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 지드래곤 3500.0 3.0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200.0 4.0
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 소연 4500.0 5.0
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 진 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150.0 3.0

NaN 값으로 표시됨

20. ch02.pandas-전처리-05. DataFrame 합치기 (merge)

2. DataFrame 병합하기(merge)

concat: row나 column 기준으로 단순하게 이어 붙히기
merge: 특정 고유한 키(unique id) 값을 기준으로 병합하기

pd.merge(left, right, on='기준column', how='left')

left와 right는 병합할 두 DataFrame을 대입합니다.
on 에는 병합의 기준이 되는 column을 넣어 줍니다.
how 에는 'left', 'right', 'inner', 'outer' 라는 4가지의 병합 방식중 한가지를 택합니다.

이름이 겹치는 것을 키값(기준)으로 삼아 병합.

2-1. left, right 방식

병합할 2개의 DataFrame의 행의 갯수가 맞지 않을 때

'left' 옵션을 부여하면, left DataFrame에 키 값이 존재하면 해당 데이터를 유지하고,
병합한 right DataFrame의 값은 NaN이 대입.

df_right = df2.drop([1, 3, 5, 7, 9], axis=0)
df_right
>이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 진 4200 4
5 태연 3700 3
6 차은우 3850 5
7 백호 3900 4
8 JR 4100 3
9 슈가 4150 3

pd.merge(df, df_right, on='이름', how = 'left')
>이름 그룹 소속사 성별 생년월일 키 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200.0 4.0
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 NaN NaN
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150.0 3.0


left 옵션 -> 왼쪽 기준으로 하여 오른쪽에는 NaN으로 표시

'right' 옵션을 부여하면 right DataFrame을 기준으로 병합.
left DataFrame이 더 많은 데이터를 보유
->right를 기준으로 병합하면 DataFrame 사이즈가 줄어듦.

right에 있는 기준으로 합쳐지되 right에만 없는 것들 자동으로 드랍.

pd.merge(df, df_right, on='이름', how = 'right')
>이름 그룹 소속사 성별 생년월일 키 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000 3
1 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200 4
2 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300 3
3 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400 6
4 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
5 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700 3
6 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850 5
7 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900 4
8 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100 3
9 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150 3


2-2. inner, outer 방식 (교집합이냐 합집합이냐)

inner 방식은 두 DataFrame에 모두 키 값이 존재하는 경우만 병합합니다.
outer 방식은 하나의 DataFrame에 키 값이 존재하는 경우 모두 병합합니다.
outer 방식에서는 없는 값은 NaN으로 대입됩니다.

pd.merge(df, df_right, on='이름', how = 'inner') 교집합 둘다 있어야

pd.merge(df, df_right, on='이름', how='outer') 합집합 둘 중에 하나만 있어도 병합
>이름 그룹 소속사 성별 생년월일 키 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200.0 4.0
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 NaN NaN
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150.0 3.0

2-3. column 명은 다르지만, 동일한 성질의 데이터

df_right.columns = ['성함', '연봉', '가족수']

df에서는 '이름', df_right에서는 '성함'으로 표기되어 기준이 되는 column 지정 X
->left_on, right_on 옵션 사용

pd.merge(df, df_right, left_on = '이름', right_on = '성함', how = 'outer')




패스트캠퍼스 데이터분석 강의 링크
https://bit.ly/3imy2uN