빅데이터 분석기사[python]/pandas와 기본 데이터 처리

[python 파이썬, pandas 판다스] 데이터 값 변경하기, 바꾸기

sunning 2022. 5. 11. 10:08
728x90

이번에는 python 판다스에서 데이터의 특정 값을 바꾸고 싶을 때 어떻게 하는지 정리해보자.

먼저 pandas를 import해서 데이터 프레임을 만들어준다.

 

import pandas as pd

DF = pd.DataFrame({'name' : ['Minsoo','Minju','Yeomin','Hyeri','Junghun','Sunny','Bummee','Luna'],
                   'old'  : [33,25,19,25,32,36,23,36],
                   'sex'  : ['M','W','W','W','M','W','M','W'],
                   'score1': [91,50,69,98,72,85,43,61], 
                   'score2': [65,77,56,82,79,91,71,63],
                   'time' : [30,95,64,88,34,69,15,25],
                   })
DF

 

 

위의 예시에서 각 사람들의 나이 대신 10대/20대/30대의 범위로 나누어보자. 즉, old 칼럼을 19는 10으로 23,25은 20으로  32, 33, 36은 30으로 바꾸어보자.

 

1) 데이터의 특정 칼럼의 범주와 수 확인하기 : 데이터셋명['칼럼명'].value_counts()

vaue_counts()를 사용하면 특정 값이 몇 개가 있는지 확인할 수 있다. 25세와 36세는 2명, 나머지 나이는 각 1명씩 있다는 의미다.

 

DF['old'].value_counts()

 

 

 

2) 데이터 값 바꾸기

범주와 값의 개수를 확인했으니 데이터를 변경해볼텐데 변경하는 방법은 replace를 사용하는 것과 함수를 정의하는 것으로 2가지가 있다.

 

replace 기능 사용하기

replace를 사용하기 전에 어떠한 칼럼에서의 어떠한 값을 어떠한 값으로 변경할 것인지를 담고있는 사전을 만들어준다.

나는 칼럼명이 'old'인 데이터의 값을 19는 10으로, ... , 36은 30으로 바꾸기 위해 old_range라는 사전을 만들었다.

그리고 replace(딕셔너리)를 사용하여 나이를 범위로 변경한 새로운 데이터프레임을 DF1으로 정의하면 아래와 같이 old 값이 다 변경된 것을 확인할 수 있다.

 

old_range = {'old' : {19:10, 23:20, 25:20, 32:30, 33:30, 36:30}}
DF1 = DF.replace(old_range)
DF1

 

 

함수 정의하기

위에서처럼 replace를 사용하면 다양한 나이에 따라서 하나씩 key값과 value값을 추가해줘야한다. 이러한 경우 함수를 정의하여 값을 변경하면 이러한 번거로움을 줄일 수 있다.

먼저, old_groups이라는 나이 값에 따라서 나이의 범위를 출력하는 함수를 만든다. 그리고 apply() 함수를 사용하여 함수를 데이터의 칼럼에 적용할 수 있다. apply() 함수는 Pandas DataFrame을 엑셀의 매크로 함수처럼 각 column에 대해 연산을 수행하는 함수이다.

apply(사용자 정의 함수)를 수행하면 DF의 'old' 칼럼의 각 값들에 old_groups 함수가 적용된 것을 확인할 수 있다.

 

def old_groups(values):
    if values < 20:
        return 10
    elif values < 30:
        return 20
    elif values < 40:
        return 30
    elif values < 50:
        return 40
    elif values < 60:
        return 50
    else:
        return 60
    
DF['old'] = DF['old'].apply(old_groups)
DF

 

 

728x90