can only concatenate str (not "float") to str 에러 해결

jhanks21·2023년 11월 9일

ML_DL

목록 보기
1/1

문제 상황

https://github.com/chongjason914/scikit-learn-tutorial/blob/main/feature-encoding.ipynb 에서 Feature_encoding 실습을 하다가 예기치 못한 에러가 발생했다.

참고로 실행 환경은 14인치 mac m1 프로에서 conda 가상환경에서 실습을 진행하였다.

사실 스크립트를 읽고 이해하면서 그대로 코드를 작성해보며 실습을 하던 와중 제목과 같은 에러를 맞닥뜨렸다. 아래의 코드에서 에러가 발생했다.

# Calculate average of all test results
data['mean score'] = data.mean(axis = 1)

# Drop math score, reading score and writing score
data = data.drop(['math score', 'reading score', 'writing score'], axis = 1)

# Show first 5 rows of new dataframe
data.head()

그리고 에러는 다음과 같이 발생하였다.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
      1 # Calculate average of all test results
----> 2 data['mean score'] = data.mean(axis = 1)
      4 # Drop math score, reading score and writing score
      5 data = data.drop(['math score', 'reading score', 'writing score'], axis = 1)

File ~/anaconda3/envs/DL_env/lib/python3.9/site-packages/pandas/core/frame.py:11335, in DataFrame.mean(self, axis, skipna, numeric_only, **kwargs)
  11327 @doc(make_doc("mean", ndim=2))
  11328 def mean(
  11329     self,
ref='~/anaconda3/envs/DL_env/lib/python3.9/site-packages/pandas/core/frame.py:0'>0</a>;32m   (...)
  11333     **kwargs,
  11334 ):
> 11335     result = super().mean(axis, skipna, numeric_only, **kwargs)
  11336     if isinstance(result, Series):
  11337         result = result.__finalize__(self, method="mean")

File ~/anaconda3/envs/DL_env/lib/python3.9/site-packages/pandas/core/generic.py:11984, in NDFrame.mean(self, axis, skipna, numeric_only, **kwargs)
  11977 def mean(
  11978     self,
  11979     axis: Axis | None = 0,
ref='~/anaconda3/envs/DL_env/lib/python3.9/site-packages/pandas/core/generic.py:0'>0</a>;32m   (...)
  11982     **kwargs,
...
     47 def _sum(a, axis=None, dtype=None, out=None, keepdims=False,
     48          initial=_NoValue, where=True):
---> 49     return umr_sum(a, axis, dtype, out, keepdims, initial, where)

TypeError: can only concatenate str (not "float") to str

에러 원인

에러 원인은 현재 내가 사용하고 있던 pandas의 version이 2.1.2인데 pandas가 2.0.0으로 업데이트를 하면서, 기존 mean method의 인수들 중 하나인 numeric_only의 default값이 None에서 False로 바뀌었기 때문이다. pandas 2.0.0 이후 mean method의 인수 default는 아래와 같다.

Signature:
DataFrame.mean(
    axis: 'AxisInt | None' = 0,
    skipna: 'bool_t' = True,
    numeric_only: 'bool_t' = False,
    **kwargs,
)

해결 방법

따라서 기존 코드에 numeric_only 인수의 값을 True로 변경해주었다.

# Calculate average of all test results
data['mean score'] = data.mean(axis = 1, numeric_only=True)

# Drop math score, reading score and writing score
data = data.drop(['math score', 'reading score', 'writing score'], axis = 1)

# Show first 5 rows of new dataframe
data.head()

0개의 댓글