[Python.Pandas] Map 함수 실전편 + .replace함수 사용하기
2020. 12. 20. 05:00ㆍPython과 머신러닝/Pandas 데이터 분석
0. 이전 포스트
1. wget으로 데이터 다운로드하여 .unique로 데이터 종류 분석하기
In [1]:import wget url = 'https://raw.githubusercontent.com/rstudio/Intro/master/data/wages.csv'
wget.download(url)
Out[1]:'wages.csv'
In [2]:df = pd.read_csv("./wages.csv")
df.head()
Out[2]:
earn height sex race ed age
0 79571.299011 73.89 male white 16 49
1 96396.988643 66.23 female white 16 62
2 48710.666947 63.77 female white 16 33
3 80478.096153 63.22 female other 16 95
4 82089.345498 63.08 female white 17 43
In [3]:df.sex.unique()
Out[3]:array(['male', 'female'], dtype=object)
- wget을 통하여 데이터를 다운로드하고, pd.read_csv로 데이터를 읽어오는 것은 이전 포스트에서 정리한 바 있다.
2020/11/17 - [Python과 머신러닝/웹 데이터 추출] - [Python.Web] wget으로 웹 데이터 다운로드 및 파싱 - wget.download
2020/11/23 - [Python과 머신러닝/웹 데이터 추출] - [Python.Web] BeautifulSoup과 wget으로 웹크롤링, 데이터 스크레이핑
2020/11/30 - [Python과 머신러닝/웹 데이터 추출] - [Python.ML] Pandas로 데이터 불러오기 - df.head를 통해서 전체 데이터 중 상위 5개 row를 볼 수 있지만, .map을 통해 값을 변경하고 싶으면 한 column/series의 데이터를 보고 싶은 경우가 많다.
- 이럴 때는 df.[Series/Column명].unique를 사용하여 데이터의 종류를 파악할 수 있다.
- df.sex.unique() 는 sex라는 column에 male/female 정보만 있다는 것을 확인할 때 사용된다.
2. 함수 정의를 통한 data encoding
In [22]:def change_sex(x):
return 0 if x=='male' else 1
In [23]:df['sex_code'] = df.sex.map(change_sex)
df
Out[23]:
earn height sex race ed age sex_code
0 79571.299011 73.89 male white 16 49 0
1 96396.988643 66.23 female white 16 62 1
2 48710.666947 63.77 female white 16 33 1
3 80478.096153 63.22 female other 16 95 1
4 82089.345498 63.08 female white 17 43 1
... ... ... ... ... ... ...
1374 30173.380363 71.68 male white 12 33 0
1375 24853.519514 61.31 female white 18 86 1
1376 13710.671312 63.64 female white 12 37 1
1377 95426.014410 71.65 male white 12 54 0
1378 9575.461857 68.22 male white 12 31 0
1379 rows × 7 columns
- change_sex라는 함수는 male은 0으로, female은 1로 바꿔주는 함수이다.
- 이전 포스트에서 정리했듯이 이 함수를 Series.map의 Parameter로 전달하면, Series의 각 value를 해당 함수로 변환시킨다.
2020/12/19 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map - 그렇기 때문에 df.sex.map(change_sex)라는 함수는, df.sex라는 Series의 값을 change_sex 함수를 통해 값을 변형해라는 의미로 전달된다.
- 이 결과값을 다시 df['sex_code']에 담았기 때문에, df를 출력해보면 sex_code라는 Series가 추가된 것을 볼 수 있고, male인 경우에는 0, female인 경우에는 1로 잘 담긴 것을 확인할 수 있다.
- Map 함수가 중요한 이유는, male/female이라는 string data를 가지고는 Pandas나 Python의 어떤 라이브러리를 가지고도 기계학습을 시키기가 제한되거나 불가능하다.
- Data를 정수형/연속형 데이터로 변형시켜줘야 컴퓨터는 이러한 숫자 데이터를 가지고 학습을 하고, 미래를 예측하는 모델링을 할 수 있는데, 컴퓨터에게 'male', 'female'은 너무 어려운 값이다.
- 그렇기 때문에 대부분의 경우 데이터 전처리 과정에서 이러한 categorical data를 0/1/2/... 등등으로 encoding 해주는 과정이 필수적이고, 그러기 위해서는 .map 함수가 필수적으로 사용된다. 꼭 이해하고 있어야 한다.
3. Dict를 통한 data encoding
In [24]:df['sex_code'] = df.sex.map({'male':0, 'female':1})
df
Out[24]:
earn height sex race ed age sex_code
0 79571.299011 73.89 male white 16 49 0
1 96396.988643 66.23 female white 16 62 1
2 48710.666947 63.77 female white 16 33 1
3 80478.096153 63.22 female other 16 95 1
4 82089.345498 63.08 female white 17 43 1
... ... ... ... ... ... ...
1374 30173.380363 71.68 male white 12 33 0
1375 24853.519514 61.31 female white 18 86 1
1376 13710.671312 63.64 female white 12 37 1
1377 95426.014410 71.65 male white 12 54 0
1378 9575.461857 68.22 male white 12 31 0
1379 rows × 7 columns
- 위와 같은 작업을 함수가 아닌 dict를 통해서도 할 수 있다.
- dict의 key를 input 값, dict의 value를 output 값으로 지정해준다면, 원하는 대로 male은 0, female은 1로 encoding 되는 것을 확인할 수 있다.
- 꼭 함수 정의를 하지 않더라도, dict type을 통해서도 동일하게 가능하다는 것을 보여주는 예시이다.
4. .replace를 사용한 data encoding
In [25]:df.sex.replace({'male':0, 'female':1})
df.sex.replace(['male', 'female'], [0,1])
Out[25]:
0 0
1 1
2 1
3 1
4 1
..
1374 0
1375 1
1376 1
1377 0
1378 0
Name: sex, Length: 1379, dtype: int64
- .replace 함수는 .map 함수와 유사한 동작을 하고 In[25]와 같이 사용하여, encoding을 수행할 수 있다.
5. 관련 포스트
- 2020/12/21 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] DataFrame.apply, DataFrame.applymap
- 2020/12/22 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Built-in Function 이해하기 - .describe()
'Python과 머신러닝 > Pandas 데이터 분석' 카테고리의 다른 글
[Python.Pandas] Built-in Function 이해하기 - .describe() (0) | 2020.12.22 |
---|---|
[Python.Pandas] DataFrame.apply, DataFrame.applymap (0) | 2020.12.21 |
[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map (0) | 2020.12.19 |
[Python.Pandas] Selection과 Drop (0) | 2020.12.18 |
[Python.Pandas] DataFrame / Series 간 Operation 이해 (0) | 2020.12.17 |