문제 발단
rel(상관 O) 컬럼의 값에는 1을, irrel(상관 X) 컬럼의 값에는 -0.2 값을 곱하여 더한 뒤, total_cnt로 나눠 표준화를 하고자 할 때 아래 코드를 사용했다.
df['score'] = df.apply(lambda x: (x['rel']*1 - 0.2*x['irrel'])/x['total_cnt'], axis=1)
이때 발생했던 오류가 바로 TypeError: unsupported operand type(s) for *: 'float' and 'decimal.Decimal' 이다.
해당 오류는 pandas의 DataFrame에 .apply() 메서드를 사용할 때 발생했던 오류로, 파이썬에서 float 타입과 decimal.Decimal 타입 사이의 연산을 지원하지 않기 때문에 발생한다.
이를 해결하기 위해서는 decimal.Decimal 형식의 변수를 float로 변환하여 계산해야 한다.
Step 1.
먼저, DataFrame을 살펴보자.
import decimal
df = pd.DataFrame({'rel': [decimal.Decimal('10.5'), decimal.Decimal('7.8')],
'irrel': [decimal.Decimal('1.2'), decimal.Decimal('3.4')],
'total_cnt': [decimal.Decimal('100'), decimal.Decimal('50')]})
# 결과
rel irrel total_cnt
0 10.5 1.20000 100.0
1 7.8 3.40000 50.0
Step 2.
다시, rel(상관 O) 컬럼의 값에는 1을, irrel(상관 X) 컬럼의 값에는 -0.2 값을 곱하여 더한 뒤, total_cnt로 나눠 표준화를 하고자 할 때 각각의 컬럼을 float()으로 감싸준다.
df['score'] = df.apply(lambda x: (float(x['rel'])*1 - 0.2*float(x['irrel']))/float(x['total_cnt']), axis=1)
여기서 'axis=1' 옵션의 의미는 함수를 DataFrame의 각 행(row)에 적용하여 결과를 반환하도록 지정한다는 의미다.
(default 값으로 'axis=0'로 지정되어 있으며, 'axis=0' 옵션은 DataFrame의 각 열(column)에 적용하여 결과를 반환하게 된다.)
결과
# 결과
rel irrel total_cnt score
0 10.5 1.2 100.0 0.099
1 7.8 3.4 50.0 0.128
정상적으로. apply() 메서드가 수행됐다.
'Python > pandas' 카테고리의 다른 글
[pandas] 두 개의 DataFrame을 SQL처럼 JOIN 하는 방법 (0) | 2023.05.08 |
---|---|
[python] pandas DataFrame Index 초기화 (0) | 2023.02.22 |