DataFrame의 column 값을 변환시키는 방법


1
import pandas as pd
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)


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 값이 존재하여야한다

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)
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) 로직 함수 정의

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)
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 함수를 적용


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

1
2
3
4
my_map = {
"남자": "male",
"여자": "female"
}
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