PL/Python

[코드 스터디] UCI-HAR 데이터셋2: 중복칼럼 리네이밍

PIYA 2022. 11. 23.

포스팅 목적

지난번 포스트에서는 UCI-HAR 데이터셋에서 중복피쳐가 무엇인지 확인하고,

데이터값까지 중복인지 알아보는 코드를 작성했다.

 

이번 포스트에서는 UCI-HAR 데이터셋의 중복된 칼럼이름을 리네이밍하는 코드를 작성하자.

 

 

2022.10.28 - [PL/Python] - 코드 스터디: UCI-HAR 데이터셋 중복칼럼 리네이밍 (1)

 

코드 스터디: UCI-HAR 데이터셋 중복칼럼 리네이밍 (1)

포스팅 목적 코드를 작성하는 연습을 하고, 어떤 코드를 썼는지 기록하는 포스팅. 특정 상황에서 문제를 해결하기 위해 어떤 코드를 작성했는지 정리하자. 문제상황 UCI-HAR 데이터셋에서 피쳐이

tbr74.tistory.com

 

 

 

중복칼럼 리네이밍

아이디어

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를 받을 수 있다.

두개 포스트에 걸쳐 중복피쳐를 확인하고, 리네이밍하는 코드를 직접 작성해보았다.

 

 

 

댓글