포스팅 목적
지난번 포스트에서는 UCI-HAR 데이터셋에서 중복피쳐가 무엇인지 확인하고,
데이터값까지 중복인지 알아보는 코드를 작성했다.
이번 포스트에서는 UCI-HAR 데이터셋의 중복된 칼럼이름을 리네이밍하는 코드를 작성하자.
2022.10.28 - [PL/Python] - 코드 스터디: UCI-HAR 데이터셋 중복칼럼 리네이밍 (1)
중복칼럼 리네이밍
아이디어
features.txt를 읽은 features_df는 (561,2) 데이터프레임이다.
column_index와 column_name 두개의 칼럼으로 이루어져있다.
features_df에 column_name으로 그룹바이와 cumcount를 적용한다.
import pandas as pd
# 피쳐이름 데이터프레임 리로드/초기화
file = './human-activity/features.txt'
features_df = pd.read_csv(file, sep='\s+', header=None, names=['column_index', 'column_name'])
# 피쳐이름에 그룹바이와 cumcount를 적용한 데이터프레임을 만든다
features_cc = features_df.groupby('column_name').cumcount() # (561, )의 시리즈 생성됨
features_cc = pd.DataFrame(features_cc) # (561, 1)의 데이터프레임으로 변환
features_cc.columns = ['cumcount'] # 칼럼명 추가
앞에서 확인했듯 중복되는 피쳐이름은 3개씩 28개, 총 84개가 있다.
그러므로 중복되는 피쳐이름은 cumcount가 2까지 누적되며,
중복되지 않은 피쳐이름은 cumcount가 0이다.
(이해가지 않으면 cumcount() 코드 직접 작성해보기!)
cumcount 1과 2값을 가진 피쳐이름을 리네이밍하여 '피쳐이름_1' 또는 '피쳐이름_2'로 만들자.
병합 준비
reset_index를 이용해 features_cc와 features_df 두 데이터프레임의 공통 인덱스를 만들어 병합준비를 한다.
features_cc = features_cc.reset_index() # (561,2)가 된다.
features_df = features_df.reset_index() # (561,3)이 된다.
# 양쪽 데이터프레임 reset_index()의 결과로 생긴 'index'열을 기준으로 outer join(병합)한다.
# 그럼 결과적으로 index, column_index, column_name, cumcount 4개의 열을 가진 데이터프레임이 생성된다.
new_df = pd.merge(features_cc, features_df, on='index', how='outer')
# 병합에 사용되었던 index 칼럼을 드랍한다.
new_df = new_df.drop(['index'], axis=1) # column_index, column_name, cumcount의 (561,3)이 된다.
# column_name과 cumcount를 합쳐서 하나의 column_name으로 만드는 과정이다
# cumcount가 1이상일경우 column_name 뒤에 _1 또는 _2를 붙인다.
new_df['column_name'] = new_df[['column_name', 'cumcount']].apply(lambda x: x[0]+'_'+str(x[1])
if x[1]>0 else x[0], axis=1)
# cumcount를 column_name을 새로짓는 데 사용하였으므로 이제 드랍한다.
# 이 작업을 마치면 cumcount 칼럼이 없어져서 (561,2) 데이터프레임이 된다.
new_df = new_df.drop(['cumcount'], axis=1) # column_index, column_name 두개의 (561,2) 가 된다.
주석을 최대한 자세히 달았다.
위 코드의 결과로 중복되는 피쳐이름을 리네이밍하여 중복되지 않도록 하였다.
위의 코드에서 (561,1)임을 확인할 수 있다
맺음말
UCI-HAR 데이터셋처럼 같은 칼럼명을 갖는 경우 신규버전의 Pandas에서 duplicate error를 받을 수 있다.
두개 포스트에 걸쳐 중복피쳐를 확인하고, 리네이밍하는 코드를 직접 작성해보았다.
'PL > Python' 카테고리의 다른 글
데이터셋 분리: Validation (검증) 데이터셋은 무엇인가? (0) | 2022.12.08 |
---|---|
pandas groupby cumcount 사용법 이해 (0) | 2022.12.06 |
데이터프레임의 인덱스 중복과 loc 프로퍼티 (0) | 2022.11.02 |
pandas Dataframe, Series 차이점 정리 (데이터프레임, 시리즈) (0) | 2022.10.31 |
데이터프레임에서 for loop을 사용하는 다양한 방법 (1) | 2022.10.28 |
댓글