DataFrame의 column 값을 변환시키는 방법
python
1 | import pandas as pd |
python
1 | df = pd.read_csv('korean-idol.csv') |
1. apply + 일반 함수
apply는 Series나 DataFrame에 좀 더 구체적인 로직을 적용하고 싶은 경우 활용한다
- apply를 적용하기 위해서는 함수가 먼저 정의되어야한다
- apply는 정의한 로직 함수를 인자로 넘겨준다
Series에 적용할 경우:
df_name [ “col_name” ] .apply( func )DataFrame에 적용할 경우:
df_name .apply( func, axis = 1)
python
1 | df.head() |
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | |
---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 |
1-1. (목표) ‘성별’ column의 “남자” / "여자"를 1 / 2로 바꾼다
변환 규칙:
남자: 1 여자: 2 기타: -1
(1) 로직 함수 정의
[주의] 반드시 return 값이 존재하여야한다
python
1 | def male_or_female(x): |
(2) apply로 DataFrame에 적용
python
1 | df["성별_NEW"] = df["성별"].apply(male_or_female) |
python
1 | df.head() |
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 성별_NEW | |
---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 1 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 1 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 1 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 2 |
1-2. (목표) cm당 브랜드 평판지수를 구한다 (브랜드평판지수 / 키)
변환 규칙:
키: 178 브랜드평판지수: 99000
값: 99000 / 178
(1) 로직 함수 정의
python
1 | def cm_to_brand(df): |
(2) apply로 DataFrame에 적용
python
1 | df.apply(cm_to_brand, axis = 1) |
0 60617.857143
1 56027.949153
2 45965.250000
3 45356.747191
4 47198.815546
5 29260.308989
6 27371.321997
7 NaN
8 25503.950893
9 24156.128067
10 NaN
11 19158.617486
12 18866.594286
13 18603.051136
14 16812.885057
dtype: float64
2. apply + lamda 함수
df_name [ “col_name” ] .apply (lambda_func)
- lambda는 1줄로 작성하는 간단 함수식이다
- return을 별도로 멱기하지 않는다
(1) male_or_female 함수
python
1 | male_or_female = lambda x: 1 if x == "남자" else 0 |
python
1 | df["성별"].apply(male_or_female) |
0 1
1 1
2 1
3 1
4 0
5 1
6 1
7 0
8 1
9 1
10 0
11 1
12 1
13 1
14 1
Name: 성별, dtype: int64
(2) 실제로는 간단한 계산식을 적용하려는 경우에 많이 사용한다
python
1 | df["키/2"] = df["키"].apply(lambda x: x / 2) |
python
1 | df.head() |
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 성별_NEW | 키/2 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 | 86.80 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 1 | 88.50 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 1 | 90.00 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 1 | 89.00 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 2 | 81.05 |
apply에 함수식을 만들어서 적용해주는 것과 동일하기 때문에, 복잠한 조건식은 <함수>로, 간단한 계산식은 < lambda > 로 적용하면 된다
3. map + map 함수
df_name [ “col_name” ] .map ( map_func )
Step 1: dictionary 형식으로 map 함수를 정의하기
Step 2: DataFrame / Series에 map 함수를 적용
python
1 | df.head() |
이름 | 그룹 | 소속사 | 성별 | 생년월일 | 키 | 혈액형 | 브랜드평판지수 | 성별_NEW | 키/2 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 지민 | 방탄소년단 | 빅히트 | 남자 | 1995-10-13 | 173.6 | A | 10523260 | 1 | 86.80 |
1 | 지드래곤 | 빅뱅 | YG | 남자 | 1988-08-18 | 177.0 | A | 9916947 | 1 | 88.50 |
2 | 강다니엘 | NaN | 커넥트 | 남자 | 1996-12-10 | 180.0 | A | 8273745 | 1 | 90.00 |
3 | 뷔 | 방탄소년단 | 빅히트 | 남자 | 1995-12-30 | 178.0 | AB | 8073501 | 1 | 89.00 |
4 | 화사 | 마마무 | RBW | 여자 | 1995-07-23 | 162.1 | A | 7650928 | 2 | 81.05 |
python
1 | my_map = { |
python
1 | df["성별"].map(my_map) |
0 male
1 male
2 male
3 male
4 female
5 male
6 male
7 female
8 male
9 male
10 female
11 male
12 male
13 male
14 male
Name: 성별, dtype: object