DataFrame의 column 값을 변환시키는 방법
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)
|
이름 |
그룹 |
소속사 |
성별 |
생년월일 |
키 |
혈액형 |
브랜드평판지수 |
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 값이 존재하여야한다
1 2 3 4 5
| def male_or_female(x): if x == "남자": return 1 elif x == "여자": return 2
|
(2) apply로 DataFrame에 적용
1
| df["성별_NEW"] = df["성별"].apply(male_or_female)
|
|
이름 |
그룹 |
소속사 |
성별 |
생년월일 |
키 |
혈액형 |
브랜드평판지수 |
성별_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) 로직 함수 정의
1 2 3
| def cm_to_brand(df): value = df["브랜드평판지수"] / df["키"] return value
|
(2) apply로 DataFrame에 적용
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 함수
1
| male_or_female = lambda x: 1 if x == "남자" else 0
|
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) 실제로는 간단한 계산식을 적용하려는 경우에 많이 사용한다
1
| df["키/2"] = df["키"].apply(lambda x: x / 2)
|
|
이름 |
그룹 |
소속사 |
성별 |
생년월일 |
키 |
혈액형 |
브랜드평판지수 |
성별_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 함수를 적용
|
이름 |
그룹 |
소속사 |
성별 |
생년월일 |
키 |
혈액형 |
브랜드평판지수 |
성별_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 |
1 2 3 4
| my_map = { "남자": "male", "여자": "female" }
|
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