데이터 프레임 전처리 - 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
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를 잘 응용하면 실제로 전처리가 필요한 데이터나, 마스킹이 필요한 데이터를 다루는 데에
큰 도움이 될 것 같다.
'self.python' 카테고리의 다른 글
[python] seaborn으로 HeatMap 그리기 - 2 (최대값/최소값, Cbar, tick, Label 조절하여 그래프 그리기) (1) | 2022.12.05 |
---|---|
[python] seaborn으로 HeatMap 그리기 - 1 (0) | 2022.11.06 |
[python] 숫자 데이터 자리수 맞추어 표시하기(앞에 0 채워주기) - zfill() (0) | 2022.06.27 |
[python] 데이터 프레임 합치기 - concat, append, join (0) | 2022.06.21 |
[python] 데이터프레임 데이터 타입 바꾸기 (0) | 2022.06.20 |
댓글