본문 바로가기
self.python

[python] 데이터 프레임 전처리 - replace 이용하기

by 톤토니 2022. 7. 3.
반응형

replace

데이터 프레임 전처리 - replace 이용하기

 

지난 번 사용했던 데이터에서 추가로 학번을 데이터로 가지고 있는 데이터 프레임이 있다고 하자.

2022.06.21 - [self.python] - [python] 데이터 프레임 합치기 - concat, append, join

 

0. 데이터 프레임 준비

지난 글에서 사용했던 데이터 프레임에 학번 열을 새로 추가해서 사용해보겠다.

 

import pandas as pd

myList1 = [['Mary', 23],
          ['Kate', 25]]

myList2 = [['Mark', 27],
          ['Maxi', 30]]

mycol = ['Name', 'Age']

df1 = pd.DataFrame(myList1, columns = mycol)
df2 = pd.DataFrame(myList2, columns = mycol)

df = pd.concat([df1, df2], ignore_index=True)

myList3 = ['A', 'B','AB', 'O']
mycol3 = ['bloodType']
df3 = pd.DataFrame(myList3, columns = mycol3)

df = df.join(df3)

#################

# 여기서 부터 학번 데이터

df['number'] = ''
df['number'].iloc[0] = "2200001"
df['number'].iloc[1] = "이이공공공공이"
df['number'].iloc[2] = "22,0000,3"
df['number'].iloc[3] = "22-00.00-4"

df

22학번...

 

Mary가 입력한 형태가 내가 원하는 형식이었고 나머지는 전부 제각각으로 작성했다고 하자.

여기서 Mary가 작성한대로 숫자를 바꾸는 전처리를 replace 함수를 사용하여 할 수 있다.

 

 

 

1. 데이터 바꾸기 - replace

한글로 쓰여 있는 것은 숫자로, ','와 '.' , '-' 과 같은 기호들은 모두 없애고 싶다.

 

def new_number(number):
    myDict = {
    '공': '0',
    '일': '1',
    '이': '2',
    ',' : '',
    '-': '',
    '.': '',
    }
    for k, v in myDict.items():
        number = number.replace(k, v) 
    return number

df["processed_number"] = df["number"].apply(new_number)

df

 

보통 데이터 전처리를 하는 경우는 데이터 프레임 내의 값 하나만 하는 게 아니라 열 전체에 대해서, 행 전체에 대해서 등

여러 값으로 진행되기 때문에 replace 하는 함수를 선언하여 apply로 행 전체에 적용하는 경우가 많다.

 

그래서 replace가 필요한 경우들을 딕셔너리로 만들어두고, 반복문을 사용하여 학번 열의 모든 데이터를 원하던 형식으로 바꾸어 주었다.

 

잘 바뀐 것을 확인할 수 있다.

 

이런 경우 나는 보통 기존의 열은 삭제하는데, 혹시 모르니 삭제 안해도 된다.

df.drop('number', axis = 1, inplace = True)
df

 

 

2. 데이터 바꾸기 - replace

개인정보가 중요한 시대.. 만약 해당 데이터 프레임을 공개해야 하는 일이 있을 때, 학번과 같은 정보는 마스킹 처리를 하는 경우가 많다.

 

뒷자리가 중요하니까 2200*** 이런 식으로.

 

def myNumber(processed_number) :
    processed_number = processed_number[0:4] + '***'
    
    return processed_number

df['open_number'] = df['processed_number'].apply(myNumber)
df

 

위에서와 같은 방법으로 replace 를 사용하는 함수를 선언하여 apply로 원하는 열 데이터 전체에 적용해 주었다.

open_number 로 마스킹이 잘 되었음을 볼 수 있다.

 

이런 경우는 보통 이메일이나 휴대폰 번호가 많은 것 같다. 

abc***g@hijklm.nop , 010-****-1234  등 많이 사용되는 것 같다.

 

 

 

 

 

3. 총 정리

import pandas as pd

myList1 = [['Mary', 23],
          ['Kate', 25]]

myList2 = [['Mark', 27],
          ['Maxi', 30]]

mycol = ['Name', 'Age']

df1 = pd.DataFrame(myList1, columns = mycol)
df2 = pd.DataFrame(myList2, columns = mycol)

df = pd.concat([df1, df2], ignore_index=True)

myList3 = ['A', 'B','AB', 'O']
mycol3 = ['bloodType']
df3 = pd.DataFrame(myList3, columns = mycol3)

df = df.join(df3)

df['number'] = ''
df['number'].iloc[0] = "2200001"
df['number'].iloc[1] = "이이공공공공이"
df['number'].iloc[2] = "22,0000,3"
df['number'].iloc[3] = "22-00.00-4"

def new_number(number):
    myDict = {
    '공': '0',
    '일': '1',
    '이': '2',
    ',' : '',
    '-': '',
    '.': '',
    }
    for k, v in myDict.items():
        number = number.replace(k, v) 
    return number

df["processed_number"] = df["number"].apply(new_number)

df.drop('number', axis = 1, inplace = True)

def myNumber(processed_number) :
    processed_number = processed_number[0:4] + '***'
    
    return processed_number

df['open_number'] = df['processed_number'].apply(myNumber)
df

 

 

예시 데이터로는 replace의 중요성을 크게 강조하지 못한 것 같지만...

 

replace를 잘 응용하면 실제로 전처리가 필요한 데이터나, 마스킹이 필요한 데이터를 다루는 데에

큰 도움이 될 것 같다.

 

 

 

 

 

 

 

 

반응형

댓글