Pandas: 'Series' object has no attribute 'split' 에러 해결 방법

루트·2025년 7월 10일

python_basic_error

목록 보기
2/2
movies['genres'] = movies['genres'].split("|")

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipython-input-62-2370821272.py in <cell line: 0>()
----> 1 movies['genres'] = movies['genres'].split("|")

/usr/local/lib/python3.11/dist-packages/pandas/core/generic.py in __getattr__(self, name)
   6297         ):
   6298             return self[name]
-> 6299         return object.__getattribute__(self, name)
   6300 
   6301     @final

AttributeError: 'Series' object has no attribute 'split'

에러 원인 및 해결

AttributeError: 'Series' object has no attribute 'split' 에러는 판다스(Pandas)의 시리즈(Series) 객체에 직접 문자열(string) 메서드인 .split()을 사용하려고 했기 때문에 발생합니다.

movies['genres']: 데이터프레임의 한 열(column)을 나타내는 시리즈(Series) 객체입니다. 여러 개의 값을 담고 있는 리스트와 유사한 형태입니다.

.split(): 단 하나의 문자열에만 사용할 수 있는 메서드입니다.

즉, 여러 문자열이 들어있는 '상자'와 같은 시리즈 객체 자체를 한 번에 나누려고 시도했기 때문에 에러가 발생한 것입니다.

이 문제를 해결하려면 시리즈 내의 각 요소에 개별적으로 문자열 메서드를 적용하도록 지시해야 합니다. 이때 판다스의 .str 접근자(accessor)를 사용합니다.

필요한 기초 지식

이 에러를 완전히 이해하려면 판다스(Pandas)의 기본 데이터 구조와 파이썬의 자료형(Data Type) 개념, 그리고 판다스의 특별한 기능인 '접근자'에 대해 알아야 합니다.


1. 판다스 데이터 구조: 시리즈(Series)와 데이터프레임(DataFrame)

데이터 분석에서 가장 먼저 만나는 것이 바로 데이터의 '모양'입니다. 판다스는 주로 두 가지 형태로 데이터를 다룹니다.

  • [cite_start]데이터프레임 (DataFrame): 엑셀 시트처럼 행(row)과 열(column)으로 이루어진 2차원 표 형태의 데이터 구조입니다[cite: 376, 377]. 우리가 보통 pd.read_csv() 등으로 불러오는 데이터가 바로 데이터프레임입니다.

  • [cite_start]시리즈 (Series): 데이터프레임에서 하나의 열(column)을 선택했을 때 만들어지는 1차원 배열 형태의 데이터 구조입니다[cite: 372, 373]. [cite_start]시리즈는 여러 개의 값(value)과 각 값에 해당하는 이름표인 인덱스(index)로 구성됩니다[cite: 373, 374].

    • 이번 에러에서 movies['genres'] 코드는 movies 데이터프레임에서 'genres'라는 이름의 열 하나를 선택하는 코드입니다. 따라서 그 결과는 데이터프레임이 아닌 시리즈(Series)가 됩니다.

핵심: movies['genres']는 단일 텍스트 값이 아니라, 여러 텍스트 값이 모여있는 '시리즈'라는 목록(collection) 형태라는 것을 인지하는 것이 가장 중요합니다.


2. 자료형(Data Type)과 메서드(Method)

파이썬의 모든 변수나 값은 각자의 자료형(Data Type)을 가집니다. 예를 들어, "hello"는 문자열(str), 123은 정수(int), ['a', 'b']는 리스트(list)입니다.

중요한 것은, 특정 기능(함수 또는 메서드)은 정해진 자료형에서만 동작한다는 점입니다.

  • .split() 메서드: 이 메서드는 문자열(str) 자료형을 위한 기능입니다. 문자열을 특정 기준(separator)으로 쪼개서 리스트로 만들어주죠.
  • AttributeError가 발생하는 이유: movies['genres']시리즈(Series) 자료형인데, 여기에 문자열(str) 전용 기능인 .split()을 사용하려고 하니 파이썬이 "시리즈(Series)에는 split이라는 기능이 없습니다"라고 알려주는 것입니다.

핵심: 내가 지금 다루고 있는 데이터의 자료형이 무엇인지, 그리고 사용하려는 함수가 그 자료형에 쓸 수 있는 것인지 항상 확인하는 습관이 중요합니다. type(movies['genres']) 코드로 직접 자료형을 확인해볼 수 있습니다.


3. 판다스의 핵심 기능: .str 접근자(Accessor)

판다스는 위와 같은 문제를 해결하기 위해 아주 편리한 '다리' 역할을 하는 기능을 만들어 두었습니다. 바로 .str 접근자(Accessor)입니다.

  • 역할: 시리즈(Series) 객체에 .str을 붙이면, 해당 시리즈 안에 있는 모든 요소 각각에 문자열 메서드를 적용할 수 있게 해줍니다.
  • 동작 방식: .str 접근자는 시리즈의 각 요소를 하나씩 꺼내서, 우리가 사용하려는 문자열 메서드(예: .split())를 적용한 후, 그 결과를 다시 새로운 시리즈로 묶어서 반환해 줍니다.

핵심: 시리즈 전체에 문자열 관련 기능을 쓰고 싶을 땐, 시리즈 이름과 문자열 메서드 사이에 .str을 붙여주면 됩니다. Series.str.문자열메서드() 형태로 사용합니다.


genres_list = list(movies['genres'].apply(lambda x: x.split("|")))
genres_list

1. lambda 함수 (익명 함수)

lambda x: x.split("|")

lambda는 이름이 없는 간단한 함수를 만들 때 사용하는 키워드입니다. 일반 함수처럼 def로 정의하고 이름을 붙이는 복잡한 과정 없이, 한 줄로 함수를 정의할 때 매우 유용합니다.

주로 다른 함수의 인자(argument)로 함수를 전달할 때 많이 사용됩니다.

동작 방식

  • lambda x:: x라는 이름의 파라미터(입력값)를 받는 람다 함수를 선언합니다.
  • x.split("|"): 파라미터 x로 들어온 값이 문자열이라고 가정하고, 그 문자열에 대해 .split("|") 메서드를 실행합니다. 즉, |를 기준으로 문자열을 잘라 리스트로 만들어 반환합니다.

2. .apply() 메서드

판다스 시리즈(Series)의 메서드

apply()는 데이터프레임이나 시리즈의 모든 요소에 대해 특정 함수를 한 번에 적용하고 싶을 때 사용하는 강력한 기능입니다. for문을 직접 쓰는 것보다 훨씬 간결하고 효율적입니다.

동작 방식

  • movies['genres']는 'genres' 열 전체(시리즈)를 의미합니다.
  • .apply(lambda ...)는 'genres' 시리즈의 첫 번째 요소부터 마지막 요소까지 하나씩 꺼내어 lambda 함수에 x 값으로 전달하고 실행합니다.
  • 결과적으로 'genres' 열의 모든 셀에 split("|") 작업이 적용된 새로운 시리즈가 반환됩니다.

3. list() 생성자

자료형 변환 함수

list()는 괄호 안의 데이터를 파이썬의 기본 리스트(list) 자료형으로 변환하는 역할을 합니다.

동작 방식

  • movies['genres'].apply(...)의 결과물은 판다스의 시리즈(Series) 형태입니다.
  • 이 시리즈를 파이썬의 기본 리스트로 바꾸기 위해 list()로 전체를 감싸준 것입니다.
  • 이를 통해 최종 결과물은 판다스 시리즈가 아닌, 다루기 쉬운 파이썬 리스트가 됩니다.
profile
오컴의 면도날

0개의 댓글