AI/Pandas

[Pandas] map 함수 VS replace 함수

sangwonYoon 2023. 3. 9. 00:44

종종 모델 학습을 위해 문자열 데이터를 정수형 데이터로 변환해야 하는 경우가 있다.

이런 경우, 어떤 방법으로 변환할 수 있는지 알아보자.


map 함수

raw_data = { "product_code" : ["A", "A", "C", "B", "E", "C"], "size" : [5.3, 4.2, 7.4, 4.1, 3.7, 1.5]}

df = pd.DataFrame(raw_data)
print(df)
# 출력:
#   product_code  size
# 0            A   5.3
# 1            A   4.2
# 2            C   7.4
# 3            B   4.1
# 4            E   3.7
# 5            C   1.5

print(df.product_code.map({"A" : 1, "B": 2, "C": 3, "D": 4, "E": 5}))
# 출력:
#    product_code  size
# 0             1   5.3
# 1             1   4.2
# 2             3   7.4
# 3             2   4.1
# 4             5   3.7
# 5             3   1.5

문자열 범주형 데이터인 product_code의 값을 dict를 사용해서 정수형 데이터로 매핑하여 변환했다.

dict로 매핑하는 방법 외에도 함수로 매핑하여 변환할 수도 있다.

 

그러나, map 함수에 인자로 주어진 dict의 key에 없는 값은 NaN으로 변환된다.

raw_data = { "product_code" : ["A", "A", "C", "B", "E", "C"], "size" : [5.3, 4.2, 7.4, 4.1, 3.7, 1.5]}

df = pd.DataFrame(raw_data)
print(df)
# 출력:
#   product_code  size
# 0            A   5.3
# 1            A   4.2
# 2            C   7.4
# 3            B   4.1
# 4            E   3.7
# 5            C   1.5

# 위 코드와 달리, dict에 "A"가 빠졌다.
df["product_code"] = df.product_code.map({"B": 2, "C": 3, "D": 4, "E": 5}) 
print(df)
# 출력:
#    product_code  size
# 0           NaN   5.3    A에 해당하는 값이 NaN으로 변환되었다.
# 1           NaN   4.2
# 2           3.0   7.4
# 3           2.0   4.1
# 4           5.0   3.7
# 5           3.0   1.5

 

replace 함수

이렇게 의도치 않은 NaN 값이 생성되는 문제는 replace 함수를 사용하여 해결할 수 있다.

raw_data = { "product_code" : ["A", "A", "C", "B", "E", "C"], "size" : [5.3, 4.2, 7.4, 4.1, 3.7, 1.5]}

df = pd.DataFrame(raw_data)
print(df)
# 출력:
#   product_code  size
# 0            A   5.3
# 1            A   4.2
# 2            C   7.4
# 3            B   4.1
# 4            E   3.7
# 5            C   1.5

df["product_code"] = df.product_code.replace({"B": 2, "C": 3, "D": 4, "E": 5})
print(df)
# 출력:
#   product_code  size
# 0            A   5.3    # 딕셔너리에 A에 대한 매핑이 없기 때문에 값이 유지된다. 
# 1            A   4.2
# 2            3   7.4
# 3            2   4.1
# 4            5   3.7
# 5            3   1.5