본문 바로가기
판다스/판다스 에러 강의

[pandas] AttributeError: DataFrame' object has no attribute 'str' 에러

by 김판다t 2024. 10. 20.

판다스에서 AttributeError: DataFrame' object has no attribute 'str' 원인과 해결

판다스에서 문자열을 처리할 때 자주 사용하는 str 메서드를 데이터 프레임 전체에 적용하려 하면, AttributeError: DataFrame' object has no attribute 'str' 에러가 발생하게 됩니다. 본 글에서는 이 에러의 원인과 해결 방법을 살펴보겠습니다. str 메서드 중 가장 빈번하게 사용되는 str.contains 메서드를 예로 들어 설명하겠습니다.

 

AttributeError란?

 

AttributeError의 일반적인 원인과 해결 방법에 대해 궁금하신 분은 링크 내용을 참고하세요. 요약하자면, AttributeError는 객체가 호출하려는 속성이나 메서드를 가지고 있지 않을 때 발생하는 오류입니다. 객체에서 발생하는  AttributeError는 주로 객체의 자료형이 예상과 다를 때 발생합니다.

 

https://kimpanda.tistory.com/249

 

 

에러 발생 상황

 

먼저 예시 데이터 프레임 df를 생성합니다.

import pandas as pd
# 예제 데이터 프레임 df 생성
data = {
    'col1': ['good', 'badly', 'badness', 'bad'],
    'col2': ['great', 'excellent', 'bad', 'amazing'],
    'col3': ['awesome', 'wonderful', 'badness', 'fantastic']
}
df = pd.DataFrame(data)

 

str.contains는 각 셀이 특정 단어를 포함하고 있는지를 True 또는 False로 반환하는 메서드로, 이는 판다스의 시리즈 객체에만 사용할 수 있습니다. 즉, 데이터 프레임의 개별 열이나 행에 대해서만 작동합니다. 따라서 데이터 프레임 전체에 str.contains를 적용하려고 하면, 다음과 같은 에러가 발생하게 됩니다.

# 데이터 프레임에 직접 str.contains를 적용 -> 에러 발생
df.str.contains('bad')
AttributeError: 'DataFrame' object has no attribute 'str'

 

위 코드는 df에 str.contains를 적용해 데이터 프레임 전체에 대해 str.contains를 호출하려고 했기 때문에 DataFrame' object has no attribute 'str'라는 에러가 발생합니다.

 

올바른 사용법

 

이 문제를 해결하려면, 데이터 프레임의 특정 열에 대해 str.contains를 적용해야 합니다. 예를 들어, col1 열에서 'bad'라는 문자열이 포함된 행을 찾으려면 다음과 같이 작성할 수 있습니다.

# 'col1' 열에서 'bad'가 포함된 셀 찾기 
df['col1'].str.contains('bad')
0    False
1     True
2     True
3     True
Name: col1, dtype: bool

 

이 코드는 데이터 프레임의 col1 열에 대해 str.contains를 적용하여, col1 열에서  'bad'라는 문자열이 셀에 포함된 행을 찾아낼 수 있습니다.

 

데이터 프레임 전체에 str.contains를 적용하기

 

때로는 데이터 프레임의 여러 열에서 특정 단어가 포함된 행을 찾아야 할 경우가 있습니다. 이때 데이터 프레임 전체에 str.contains를 적용하는 것이 필요합니다. 이러한 상황에서는 apply 함수와 함께 str.contains를 사용하는 방법이 효과적입니다.

 

(1) 모든 열에 'bad'가 포함된 행 찾기

데이터 프레임의 모든 열에 대해 'bad'가 포함된 행을 찾으려면, apply로 데이터 프레임 전체에 str.contains를 적용한 후, 그 결과를 all 함수로 집계하여 모든 셀에서 'bad'가 포함된 행을 찾을 수 있습니다.

# 모든 열에서 'bad'가 포함된 행 찾기 
cond1 = df.apply(lambda col: col.str.contains('bad')).all(axis=1) 

# 'bad'가 모든 열에 포함된 행 필터링
out1 = df[cond1]
 
out1
 
 
(2) 하나의 열이라도 'bad'가 포함된 행 찾기

하나의 열이라도 'bad'가 포함된 행을 찾으려면, apply로 데이터 프레임 전체에 str.contains를 적용한 후, 각 열의 결과를 any 함수로 집계하여 처리할 수 있습니다.

# 하나의 열이라도 'bad'가 포함된 행 찾기 
cond2 = df.apply(lambda col: col.str.contains('bad')).any(axis=1) 

# 'bad'가 하나라도 포함된 행 출력 
out2 = df[cond2]
 
out2:

이 방법을 통해 각 행에 'bad'가 포함된 셀이 하나라도 있는 경우, 그 행들을 출력할 수 있습니다.

 

결론

 

판다스에서 발생하는 DataFrame' object has no attribute 'str' 에러는 str 메서드를 데이터 프레임 전체에 적용하려고 할 때 발생합니다. 이 문제를 해결하기 위해서는 데이터 프레임의 특정 열(시리즈)에 대해 str 메서드를 적용해야 하며, 데이터 프레임 전체에 str 메서드를 적용하려면 apply와 함께 사용해야 합니다.

 

 

 


교보문고 구매 페이지, 알라딘 구매 페이지yes24 구매 페이지