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) 개념, 그리고 판다스의 특별한 기능인 '접근자'에 대해 알아야 합니다.
데이터 분석에서 가장 먼저 만나는 것이 바로 데이터의 '모양'입니다. 판다스는 주로 두 가지 형태로 데이터를 다룹니다.
[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) 형태라는 것을 인지하는 것이 가장 중요합니다.
파이썬의 모든 변수나 값은 각자의 자료형(Data Type)을 가집니다. 예를 들어, "hello"는 문자열(str), 123은 정수(int), ['a', 'b']는 리스트(list)입니다.
중요한 것은, 특정 기능(함수 또는 메서드)은 정해진 자료형에서만 동작한다는 점입니다.
.split() 메서드: 이 메서드는 문자열(str) 자료형을 위한 기능입니다. 문자열을 특정 기준(separator)으로 쪼개서 리스트로 만들어주죠.AttributeError가 발생하는 이유: movies['genres']는 시리즈(Series) 자료형인데, 여기에 문자열(str) 전용 기능인 .split()을 사용하려고 하니 파이썬이 "시리즈(Series)에는 split이라는 기능이 없습니다"라고 알려주는 것입니다.핵심: 내가 지금 다루고 있는 데이터의 자료형이 무엇인지, 그리고 사용하려는 함수가 그 자료형에 쓸 수 있는 것인지 항상 확인하는 습관이 중요합니다.
type(movies['genres'])코드로 직접 자료형을 확인해볼 수 있습니다.
.str 접근자(Accessor)판다스는 위와 같은 문제를 해결하기 위해 아주 편리한 '다리' 역할을 하는 기능을 만들어 두었습니다. 바로 .str 접근자(Accessor)입니다.
.str을 붙이면, 해당 시리즈 안에 있는 모든 요소 각각에 문자열 메서드를 적용할 수 있게 해줍니다..str 접근자는 시리즈의 각 요소를 하나씩 꺼내서, 우리가 사용하려는 문자열 메서드(예: .split())를 적용한 후, 그 결과를 다시 새로운 시리즈로 묶어서 반환해 줍니다.핵심: 시리즈 전체에 문자열 관련 기능을 쓰고 싶을 땐, 시리즈 이름과 문자열 메서드 사이에
.str을 붙여주면 됩니다.Series.str.문자열메서드()형태로 사용합니다.
genres_list = list(movies['genres'].apply(lambda x: x.split("|")))
genres_list
lambda 함수 (익명 함수)lambda x: x.split("|")
lambda는 이름이 없는 간단한 함수를 만들 때 사용하는 키워드입니다. 일반 함수처럼 def로 정의하고 이름을 붙이는 복잡한 과정 없이, 한 줄로 함수를 정의할 때 매우 유용합니다.
주로 다른 함수의 인자(argument)로 함수를 전달할 때 많이 사용됩니다.
lambda x:: x라는 이름의 파라미터(입력값)를 받는 람다 함수를 선언합니다.x.split("|"): 파라미터 x로 들어온 값이 문자열이라고 가정하고, 그 문자열에 대해 .split("|") 메서드를 실행합니다. 즉, |를 기준으로 문자열을 잘라 리스트로 만들어 반환합니다..apply() 메서드apply()는 데이터프레임이나 시리즈의 모든 요소에 대해 특정 함수를 한 번에 적용하고 싶을 때 사용하는 강력한 기능입니다. for문을 직접 쓰는 것보다 훨씬 간결하고 효율적입니다.
movies['genres']는 'genres' 열 전체(시리즈)를 의미합니다..apply(lambda ...)는 'genres' 시리즈의 첫 번째 요소부터 마지막 요소까지 하나씩 꺼내어 lambda 함수에 x 값으로 전달하고 실행합니다.split("|") 작업이 적용된 새로운 시리즈가 반환됩니다.list() 생성자list()는 괄호 안의 데이터를 파이썬의 기본 리스트(list) 자료형으로 변환하는 역할을 합니다.
movies['genres'].apply(...)의 결과물은 판다스의 시리즈(Series) 형태입니다.list()로 전체를 감싸준 것입니다.