준비
교내 경진대회를 진행하면서,
그룹화된 데이터를 다루게 되었는데 진행했던 과정들을 차례대로 포스팅 해보겠습니다.
공부를 하고 있는 입장에서, 더 좋은 방법을 알려주시면 대단히 감사합니다. ㅎㅎ
.csv 파일이 30MB의 크기 정도여서, 반디집으로 분할 압축하여 올렸습니다.
엑셀로 파일을 열어 보시면, 위의 사진과 같은 형태의 데이터입니다.
자세한 내용들은 구현을 하면서 살펴보도록 하겠습니다.
주피터 노트북으로 구현
In [1] :
import numpy as np
import pandas as pd
import json
- 데이터를 불러오기에 앞서 필요한 라이브러리를 불러옵니다. (numpy, pandas, json)
In [2] :
train_df = pd.read_csv("train.csv", encoding='euc-kr')
- pandas를 사용해 다루게 될 데이터를 불러옵니다.
- 파일 안에 한글로 된 내용이 있기에 encoding='euc-kr'를 포함했습니다.
In [3] :
train_df.shape
(10000, 5)
In [4] :
print(train_df.columns.values)
['분석데이터' 'label' 'Feature_Group_A' 'Feature_Group_B' 'Feature_Group_C']
.shape() 함수와 .columns.values를 통해 데이터의 간단한 형태를 살펴봤습니다.
결과를 보면 5개의 column으로 이루어진 10000개의 데이터 행을 가지고 있었으며,
column의 이름은 각각 '분석데이터', 'label', 'Feature_Group_A', 'Feature_Group_B', 'Feature_Group_C'임을 확인할 수 있었습니다.
In [5] :
train_df.head()
.head() 함수로 데이터의 5행까지 출력하여 간단한 형태를 살펴볼 수 있습니다.
분석데이터 열은 단순한 데이터의 index 번호임을 알 수 있습니다.
label 열은 특징에 따라 0, 1 로 이루어진 이진 분류 타겟 값임을 알 수 있습니다.
(교내 경진대회의 목적이 의미를 알 수 없는 데이터를 활용하여 0과 1로 정답을 맞추는 대회였습니다.)
Feature Group A, B 열은 한 행에 하나의 배열이 들어가 있는 형태였습니다.
Feature Group C 열은 json의 형태라고 판단했었습니다.
Feature Group C의 내용을 각각의 column으로 빼야겠다고 생각을 했었고,
그렇게 코딩을 시작했습니다.
In [6] :
train_df['Feature_Group_C'][0]
Out [6] :
"{'numstrings': 655, 'avlength': 6.077862595419847, 'printabledist': [57, 37, 41, 41, 33, 27, 38, 35, 30, 23, 35, 35, 41, 20, 46, 33, 42, 21, 51, 37, 42, 36, 36, 34, 25, 27, 36, 32, 26, 24, 26, 30, 48, 61, 52, 61, 50, 50, 41, 44, 36, 33, 38, 27, 49, 46, 49, 58, 58, 52, 61, 60, 50, 39, 72, 42, 29, 39, 44, 27, 44, 28, 34, 46, 45, 60, 62, 52, 48, 69, 37, 39, 48, 64, 52, 38, 60, 42, 55, 70, 29, 20, 62, 54, 49, 55, 44, 32, 26, 32, 28, 30, 33, 23, 26, 32], 'printables': 3981, 'entropy': 6.519481182098389, 'paths': 0, 'urls': 0, 'registry': 0, 'MZ': 4}"
어떠한 형태인지 자세히 살펴보기 위해서 첫번째 행의 데이터를 살펴봤습니다.
'numstrings', 'avlength', printabledist' 등 나열되어 있는 key 값들을 column으로 빼고 value 값들을 데이터 행으로 정리를 해주면 되겠다고 생각을 하고 방법을 찾기 시작했습니다.
그래서 생각해낸 방법이 .json_loads() 함수로 행의 데이터를 읽고 .from_dict() 함수로 데이터 프레임을 다시 만드는 방법이었습니다.
그러나, 한 가지의 문제가 있었는데 정확하지는 않지만 json 형식은 {"key" : "value"} 형태인데 해당 데이터는 {'key': 'value'} 의 형태였기 때문에 에러가 발생했습니다.
In [7] :
modify_feature_group_C = train_df['Feature_Group_C']
characters = "\'"
for x in range(len(modify_feature_group_C)):
for y in range(len(characters)):
modify_feature_group_C[x] = modify_feature_group_C[x].replace(characters[y],"\"")
print(modify_feature_group_C)
그래서 위와 같은 코드로 데이터 행별로 변환을 해주었습니다. ( " -> ' )
In [8] :
feature_group_c_df = pd.DataFrame(columns=['numstrings','avlength','printabledist','printables','entropy','paths','urls',
'registry','MZ'])
for x in range(len(modify_feature_group_C)):
temp = json.loads(modify_feature_group_C[x])
temp2 = pd.DataFrame.from_dict(temp, orient='index')
temp2 = temp2.T
feature_group_c_df = pd.concat([temp2, feature_group_c_df], ignore_index=True)
In [9] :
feature_group_c_df.head()
- 다음으로, 빈 데이터프레임을 만들어주고 for문을 통해 각 행에서 json.loads(), .from_dict(), .transpose() 함수를 실행하고 만들어 둔 데이터프레임에 데이터를 채웠습니다.
- .head() 함수로 위와 같은 형태로 데이터 프레임이 완성된 것을 확인할 수 있습니다.
In [10] :
train_df = pd.concat([train_df, feature_group_c_df], axis=1)
train_df = train_df.drop(columns=['Feature_Group_C'], axis=1)
train_df.head()
- .concat() 함수로 원래의 데이터프레임과 새로 만든 데이터프레임을 합칩니다.
- .drop() 함수로 기존의 Feature_Group_C 열(column)을 제거해줍니다.
- .head() 함수로 결과를 확인합니다. Feature_Group_C 열이 제거되고, 안의 내용들은 각 column으로 분리되고 데이터가 잘 채워졌음을 확인할 수 있습니다.
이렇게 Feature_Group_C 즉, json형태(엄밀히 따지자면 딕셔너리 형태가 맞는 것 같습니다.)의 데이터를 분리해보는 공부를 해봤습니다. 이어서 나머지 배열 형태의 Group A와 B도 분리해보는 과정도 올리도록 하겠습니다.
도움이 되셨다면 아래 광고 한 번만 클릭해주세요 감사합니다!
'머신러닝 & 딥러닝 > 데이터 분석' 카테고리의 다른 글
데이터프레임 - 그룹화된 데이터 열(column) 가공하기(2) : 배열 형태의 데이터 각 column으로 정리하기 (0) | 2021.11.04 |
---|---|
EDA - 결측치/결측값(missing values) 분석과 barplot을 이용한 데이터 시각화 (0) | 2021.08.31 |
댓글