데이터 분석 기초 | 데이터 병합 후 처리 | 중복 데이터 확인(duplicated 함수, keep / keep_equal / keep_shape / align(axis = ) / all(axis = 1)) | 중복 데이터 삭제(drop_duplicates 함수) | 데이터 비교(compare 함수 / eq..

728x90

 

1. 데이터 병합 후 처리

 

: 데이터 병합 또는 재형성을 한 뒤에도 이상적인 모습으로 정리되지 않은 경우 처리하는 방법

 

▶ 라이브러리 설치 및 가져오기

import pandas as pd
import numpy as np

 


2. 합친 데이터에서 중복 행 확인, 삭제하기

 

: 2개 이상의 데이터를 합쳤을 때 생기는 중복데이터를 파악하고, 삭제

: 중복 데이터란, 모든 열의 값이 동일한 행을 의미

: 중복 행 유무는 deplicated() 함수로 확인

 

2-1) 중복 행 확인하기

 

* data_d 만들기

data_d = pd.DataFrame({
    '패션아이템' : ['팬츠', '팬츠', '자켓', '자켓', '자켓'],
    '스타일' : ['캐주얼', '캐주얼', '캐주얼', '비즈니스룩', '비즈니스룩'],
    '선호도(5점 만점)' : [4, 4, 3.5, 4.2, 2.7]
})

data_d

 

▶ .duplicated()

: 중복 행 유무의 결과로 bool 값을 반환

: True → 중복된 값

data_d.duplicated()

 

▶ 매개변수 keep = 

 

* keep = 'first'

: 중복되는 값 중 첫 번째 값을 keep(유지) 하는 것(첫 번째 이후 값이 중복된 값 True가 됨)

data_d.duplicated(keep = 'first')

 

* keep = 'last'

: 중복되는 값 중 마지막 값을 keep(유지) 하는 것(마지막 이전 값이 중복된 값 True가 됨)

data_d.duplicated(keep = 'last')

 

* keep = False

: 중복되는 모든 행을 다 표시함

data_d.duplicated(keep = False)

 

▶ .value_counts()

: 총 중복 행이 몇 개인지 셀 때 사용

data_d.duplicated(keep = False).value_counts()

 

▶ 매개변수 subset = 

: 특정 열만 지정해서 중복 데이터를 파악할 때 사용

 

* subset = ['특정 열']

data_d.duplicated(subset = ['스타일'])

 

* 특정 열의 중복 데이터 세주기

data_d.duplicated(subset = ['스타일']).value_counts()

 

 

2-2) 중복 행 삭제하기

 

▶ 중복된 행 삭제

 

* drop_duplicates()

data_d.drop_duplicates()

>> 모든 열의 값이 동일한 값(중복 값) 삭제

 

* 특정 열의 중복 값 삭제하기

data_d.drop_duplicates(subset = ['패션아이템', '스타일'], keep = 'last')

>> '패션아이템'과 '스타일' 열의 값만 같아도 중복으로 봄

: 팬츠, 캐주얼(0,1행) / 자켓, 비즈니스룩(3,4행)이 중복됨

>> drop_duplicates() 함수로 중복 값을 삭제하되

>> keep = 'last' 이기 때문에 중복된 값 중 뒷 값을 남기고, 앞 값을 삭제

: 따라서 인덱스 0값과 인덱스 3값이 삭제됨

 


3.  데이터 두 개 비교하고 다른 부분 파악하기

 

: 서로 다른 열로 구성된 데이터프레임을 병합할 때는 비교할 필요가 없음(다른 두 데이터를 그냥 합치는 것)
: 동일한 열로 구성된 데이터프레임을 병합할 때는 같은 열, 같은 행의 두 데이터 값 간에 차이가 있는지 비교해보고, 병합 전/후를 살펴보는 것이 좋음
: 데이터의 길이가 동일할 때와 다를 때 데이터를 비교하는 방법이 다름

 

3-1) 데이터 길이가 동일한 데이터 비교

 

▶ compare()

: compare() 함수는 데이터 길이가 동일한 2개 데이터를 비교할 때 사용 
: 어느 위치가 다른지 차이점을 보여줌

 

▶ 길이는 동일하지만 일부 값이 다른 2개의 데이터 생성하기(data_c, data_c2)

 

* data_c 만들기

data_c = pd.DataFrame({
    '패션아이템' : ['팬츠', '팬츠', '자켓', '자켓', '팬츠'],
    '선호도' : [1.0, 2.0, 3.0, np.nan, 5.0],
    '평점' : [1.0, 2.0, 3.0, 4.0, 5.0]
})

data_c

 

* data_c2라는 복사본 만들고 조금 수정하기

data_c2 = data_c.copy()
data_c2.loc[0, '패션아이템'] = '스커트'
data_c2.loc[2, '평점'] = 4.0
data_c2

 

▶ data_c와 data_c2 비교

: 차이가 있는 행만 출력됨

data_c.compare(data_c2)

>> NaN은 차이가 없는 부분

>> 두 데이터 중 0행과 2행이 차이 나서 출력됨

 

▶ 매개변수 keep_equal = True

: NaN 대신 원본 데이터 출력할 때 사용

data_c.compare(data_c2, keep_equal = True)

 

▶ 매개변수 align_axis = 0

: 결과 값을 행 기준으로 출력해줌

data_c.compare(data_c2, align_axis = 0)

 

▶ 매개변수 keep_shape = True

: 전체 데이터 사이즈를 유지한 채 비교하고 싶을 때 사용

: 차이가 있는 부분만 값이 출력됨

: 동일한 부분은 NaN으로 출력됨

data_c.compare(data_c2, keep_shape = True)

 

* keep_shape와 keep_equal 모두 사용해서 출력

: 전체 데이터 사이즈로 값을 비교하되, 중복되는 값은 NaN이 아닌 원본 데이터를 출력함

data_c.compare(data_c2, keep_shape = True, keep_equal = True)

 

 

3-2) 데이터 길이가 다른 데이터 비교

 

▶ eq() 

: 데이터 길이가 동일한 경우 비교 → compare() 함수 사용
: 데이터 길이가 동일하지 않은 경우 비교 → eq() 함수를 사용

: eq() 함수를 실행하면 비교하는 데이터 중 긴 길이를 기준으로 값을 출력함

: 차이 여부를 bool 타입으로 변환

 

▶ 길이가 다른 2개의 데이터 생성하기(data_e, data_e2)

 

* data_e

data_e = pd.DataFrame({
    '패션아이템' : ['팬츠', '스커트', '자켓', '티셔츠', '블라우스', '베스트'],
    '평점' : [3.0, 5.0, 7.0, 5.0, 2.0, 4.0]
})

data_e

 

* data_e2

data_e2 = pd.DataFrame({    
    '패션아이템': ['팬츠', '스커트', '자켓', '티셔츠', '블라우스', '베스트', '패딩'],
    '평점': [3.0, 6.0, 7.0, 3.0, 2.0, 4.0, 8.0]
}) 

data_e2

 

▶ data_e와 data_e2 비교

: data_e와 data_e2의 데이터는 각각 6행, 7행으로 길이가 다름

: 차이가 있는 부분은 False를 반환

data_e.eq(data_e2)

 

▶ all(axis = 1)

: 코드에 all(axis = 1)을 추가로 입력하면 행의 어느 위치에라도 두 데이터 간의 차이가 있는 값이 있는 경우 False를 반환

data_e.eq(data_e2).all(axis = 1)

 

▶ False에 해당하는 데이터만 필터링

: 두 데이터 간 차이가 있는 데이터만 출력

data_e2[data_e.eq(data_e2).all(axis = 1) == False]

 

 

3-3) 데이터 길이와 인덱스가 다른 데이터 비교

 

* data_e3 만들기

: data_e를 기준으로 길이, 인덱스, 일부 값이 다른 데이터 생성

data_e3 = pd.DataFrame({
    '패션아이템' : ['팬츠', '모자', '자켓', '패딩', '스카프', '장갑', '스커트'],
    '평점' : [3.0, 6.0, 7.0, 6.0, 7.0, 3.0, 5.0]
})

data_e3

 

▶ data_e와 data_e3 비교

: 두 데이터 간 차이가 없을 때(동일할 때)는 True

: 두 데이터 간 차이가 있을 때는 False

data_e.eq(data_e3).all(axis = 1)

 

▶ True에 해당하는 데이터만 필터링

: 두 데이터 간 차이가 없는 데이터만 출력

data_e3[data_e.eq(data_e3).all(axis = 1)]

728x90

댓글