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)]
댓글