데이터 분석 기초 | 데이터 병합 후 처리 | 중복 데이터 확인(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

    댓글