이번 포스팅에서는 파이썬 판다스 (Pandas) 데이터 프레임 (DataFrame) 내 에서 특정 조건에 따라 어떤 값들을 다른 값으로 변환하고자 할 때 사용할 수 있는 방법을 정리해 보겠습니다.
전처리를 하는 과정에서 범주형(categorical) 데이터를 숫자형 데이터로 간단하게 변환 시키고 싶을 때 등에서 활용 할 수 있습니다.
예시 데이터로 Kaggle 의 body performance 데이터를 이용해 보겠습니다.
https://www.kaggle.com/datasets/kukuroo3/body-performance-data
Body performance Data
multi class classification
www.kaggle.com
body performance 데이터를 로드 하면 하기와 같습니다. class 열이 종속변수 또는 반응변수에 해당합니다.
1. numpy.where 이용하기 (변수 또는 칼럼 내 고유값 개수가 제한적일 때)
이 중 gender 칼럼을 binary data 로 변환해 봅시다. 남자(M) 이면 1, 여자(F) 이면 0 으로 변환하겠습니다.
엑셀의 if 문 같이 어떤 조건을 주고 조건을 만족시 특정 값으로 지정하는 법을 다뤄 보겠습니다. 이 때, numpy.where 를 사용할 수 있습니다.
np.where(조건, 조건이 True 일 때 값, 조건이 False 일 때 값)
하기 코드에서"
조건: body['gender'] == M
조건이 True 면 (즉, gender 칼럼이 M 이면) M 을 0 으로 변환, 그렇지 않으면 1로 변환
사전에 numpy 를 import 하고 np 로 alias 지정해 주었습니다. 엑셀의 if 문을 아신다면 직관적으로 이해하실 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
# 성별 변수 binary 로 (남자이면 0, 여자면 1)
body['gender'] = np.where(body['gender'] == 'M', 0, 1)
body['gender'].value_counts()
'''
gender
0 8467
1 4926
Name: count, dtype: int64
'''
|
cs |
gender 칼럼이 하기와 같이 0 또는 1로 변환된 것을 확인할 수 있습니다.
numpy.where 은 다른 포스팅에서도 다룬 적이 있으니 같이 참고해 주셔도 됩니다.
https://borakeepgoing.tistory.com/274
Python | 조건에 따라 새로 값을 추가하고 이에 대한 열 추가 하기
하기와 같은 DataFrame 이 있다고 가정해보자. (df2), 각 응답자들의 나이, 성별, 연봉 정보가 담겨 있다. CompFreq 열이 Yearly, Monthly, weekly 등으로 섞여 있기 때문에 각 Respondent (응답자) 들의 CompTotal 을
borakeepgoing.tistory.com
2. pd.Series.map() 이용해서 변환하기 (변수 또는 칼럼 내 고유값 개수가 많을 때)
그런데 변수 또는 칼럼 내 고유값 개수가 여러 개라면 np.where 를 중첩해서 사용해야 합니다. 물론 가능하나 조금은 복잡해 질 수 있으므로 좀 더 심플하게 사용할 수 있는 법을 소개하겠습니다.
이 때는 Series.map() 을 사용하여 딕셔너리 내 {'Original 값: 변환하고자 하는 값'} 을 넣어 어떤 값을 특정 값으로 변환할 수 있습니다.
body performance 데이터 class 열에는 조건에 따라 body 의 등급 A, B, C, D 로 분류해 놓았습니다. 이를 숫자로 변환해 보겠습니다. (A, B, C, D 순으로 0, 1, 2, 3 으로 각각 변환)
Series.map({'Original 값: 변환하고자 하는 값'})
1
2
3
4
5
|
# class 변수 전처리
mapping = {'A':0, 'B':1, 'C':2, 'D':3}
body['class_2'] = body['class'].map(mapping)
body.head(10) |
cs |
- mapping 딕셔너리 내 :(콜론)을 기준으로 왼쪽에 있는 Original data 값을 오른쪽 변환하고자 하는 값으로 변환합니다.
- 예를 들어 class 내 A 값은 0으로 변환되는 식입니다.
참고로 map 함수는 비슷한 이름으로 파이썬 내장 함수도 있는데 시리즈와 같이 사용할 때와 약간 사용법이 다릅니다.
파이썬 내장 함수의 map은 하기 포스팅을 참고해 주세요. (처음에 파이썬을 배울 때 가장 헷갈렸던 부분 중 하나 입니다. 비슷한 이름의 함수나 메소드가 내장 함수로서 사용될 때와 Series 혹은 데이터 프레임 내에서 사용할 때가 사용법이 조금씩 다릅니다...)
먼저 파이썬의 데이터 집합 (Set, List, Dictionary, Numpy (array), Pandas series, Pandas Data Frame 등) 의 종류에 대한 이해를 정확하게 다진 후 각 데이터 집합 별로 자주 사용되는 함수들을 위주로 접해 보시는 걸 추천 드립니다. 그리고 조금씩 다른 사용법은 구글링 하시거나 이런 포스팅을 보시면서 적응해 가시면 됩니다.
https://borakeepgoing.tistory.com/346
Python | 파이썬 내장 함수 정리
많이 사용되는 파이썬 내장 함수를 언젠가는 쭈욱 정리해놔야지 라고 생각만 하다가 이제서야 포스팅을 작성하게 되었습니다. 함수 사용 자체는 간단하지만 가끔 찾아볼 일이 생겨서 이번 기회
borakeepgoing.tistory.com
이외 Series.replace 로도 가능할 수 있는데.. 이 부분은 다음에 추가해 보겠습니다
https://pandas.pydata.org/docs/reference/api/pandas.Series.replace.html
pandas.Series.replace — pandas 2.1.3 documentation
Regular expressions will only substitute on strings, meaning you cannot provide, for example, a regular expression matching floating point numbers and expect the columns in your frame that have a numeric dtype to be matched. However, if those floating poin
pandas.pydata.org
참고자료>>
https://pandas.pydata.org/docs/reference/api/pandas.Series.map.html
pandas.Series.map — pandas 2.1.3 documentation
If ‘ignore’, propagate NaN values, without passing them to the mapping correspondence.
pandas.pydata.org
'데이터관련공부 > Python' 카테고리의 다른 글
pd.Series.values (시리즈 내 개별 원소 추출) (0) | 2024.05.27 |
---|---|
[Python Viz] Dash 기본 컨셉 및 간단한 대시보드 그리기 (0) | 2024.05.19 |
python | 시각화 (Visualization), Matplotlib으로 여러 개 그래프 그리기 (0) | 2023.10.26 |
Python | pandas.index.difference() (판다스.인덱스.difference) (0) | 2023.10.26 |
Python | while 반복문 정리 (0) | 2023.10.13 |