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

[pandas] 판다스의 KeyError 강의(1)

by 김판다t 2023. 8. 8.

 

판다스의 KeyError는 99%의 경우 데이터 프레임에 해당 열이 없기 때문에 발생합니다.
그리고 이 글을 읽는 여러분도 99%에 해당할 것입니다.
그래서 이 시리즈를 다 읽으시면 대부분은 본인의 에러를 해결하실 수 있을 겁니다.

 

 

 

판다스의 KeyError 시리즈

 

판다스의 KeyError (1) : KeyError 기본편  이번 포스팅

판다스의 KeyError (2) : 판다스의 코드를 chain method로 사용할 때의 KeyError


 

실습을 위해 다음 코드를 실행해 보세요

 

import pandas as pd
df1 = pd.DataFrame({'col1': [4, 2, 0, 5], 'col2': [3, 0, 4, 3]})

 

df1

 

이 df1은 col1과 col2라는 열을 가지고 있습니다.

이 때 존재하지 않는 열인 col3를 인덱싱하면 KeyError가 발생합니다

 

df1['col3']
KeyError: 'col3'

 

 

col3 열이 존재하지 않는다는 뜻입니다

 


 

통상의 경우 위처럼 확연히 육안으로 드러나는 경우 KeyError 때문에 고생하는 일은 없습니다.

보통은 다음과 같은 경우에서 여러분을 괴롭히게 됩니다

 

실습을 위해 다음 예제 코드를 실행해 보세요.

 

import pandas as pd
data2 = {'종목': ['판다전자', '파이닉스', '넘파이', '사이킷런', '스택'], 
         ' 주가': [50000, 30000, 1000000, 60000, 30000]}
df2 = pd.DataFrame(data2)

 

df2

 

 

위 df2의 경우 주가 열이 존재하고 그렇기 때문에 주가 열로 정렬을 하고 싶습니다.

정렬하는 함수는 sort_values 이고 주가로 정렬을 하면 되겠네요!

 

df2.sort_values('주가')
KeyError: '주가'

 

 

주가 열이 분명히 존재했는데, 주가열로 정렬을 했더니 KeyError가 발생합니다.

KeyError는 분명히 해당 열이 없다는 겁니다

KeyError의 에러 메세지로 현재 df2에 주가 열이 없다는 것을 알려준 것인데,

이럴 때 초심자들은 받아들이지 못합니다.

더 나아가 KeyError가 다른 어떤 무언가에 의한 에러인 것으로 오해하게 됩니다.

 

 

KeyError가 발생하면 열을 확인하세요.

 

KeyError 는 열을 확인하는 마법의 주문 print(객체.columns)만 알고 계시면 치유가 가능합니다.

이럴 때 침착하게 print(객체.columns) 코드로 확인을 하면 됩니다.

이 경우 함수를 사용한 객체가 df2니까 에러가 발생한 코드 위에 print(df2.columns)를 넣어보세요.

 

print(df2.columns)
df2.sort_values('주가')

이는 df2에 sort_values 함수를 적용할 때  '주가' 열이 없어서 에러를 발생시켰기 때문에, sort_values 함수 적용 전에 df2에는 과연 '주가' 열이 존재하는지 확인하는 것입니다.

 

print(df2.columns)는 다음과 같은 출력을 반환합니다

 

print(df2.columns)
Index(['종목', ' 주가'], dtype='object')

 

 

주가 열 앞에 빈 칸(white space)이 붙어 있어서 육안으로는 '주가' 열로 보였지만 사실은 '  주가'열인 것입니다.

 

 

비슷한 이유로 'Close' 와 'close' 처럼 대 소문자가 다른 데도 육안으로는 같은 것으로 인식한 경우가 있습니다.

이 역시 차근히  print(객체.columns) 코드를 에러 코드 위에 입력해 확인하시면 됩니다.


 

또한 초심자가 KeyError에 고생하는 경우가 있습니다.

판다스 함수가 원본을 덮어쓰지 않는다는 것을 생각하지 못하는 경우입니다.

 

 

위 df2를 rename 함수를 이용해 '  주가'를 '주가'로 수정해 보겠습니다.

그리고 다시 정렬을 시도합니다

 

df2.rename({'주가': ' 주가'}, axis=1)
df2.sort_values('주가')
KeyError: '주가'

 

열 이름을 수정했음에도 여전히 동일한 에러가 발생합니다.

 

다시 침착하게  print(객체.columns) 코드를 에러 코드 위에 입력해 확인하시면 됩니다.

이 경우 print(df2.columns) 코드를 입력해야겠죠.

 

df2.rename({'주가': ' 주가'}, axis=1)
print(df2.columns)
df2.sort_values('주가')

 

 

마법의 주문 print(df2.columns) 코드가 담긴 셀을 실행하면 이번에도 에러는 발생하지만 원인을 알려 줍니다.

여전히 '주가' 열은 없고 빈칸이 있는 '  주가' 열을 가지고 있기에 발생한 에러인 겁니다.

 

분명히 rename 함수로 ' 주가'열을 '주가'로 바꾸었는데 왜 df2에는 '주가'열이 없을까요?

이건 판다스가 함수의 적용으로 원본 데이터를 바꾸지 않기 때문이다

 

df2.rename(columns={' 주가':'주가'})

 

 

위 코드를 사용한다고 df2가 바뀌지는 않습니다

df2를 바꾸려면 위 결과를 df2에 덮어쓰기를 해야 합니다.

 

df2 = df2.rename(columns={' 주가':'주가'})
df2.sort_values('주가')

 

 

 

그러면 우리가 원하는 정렬 결과를 얻을 수 있습니다.

 

초심자 때는 판다스의 함수가 원본을 덮어쓰지 않는다는 것을 잊고 KeyError에 당황하는 경우가 많습니다

이 경우들만 조심하면 여러분은 KeyError를 문제없이 고칠 수 있습니다.

마법의 주문 print(객체.columns)가 다 알려 줍니다.

 

또한 아래처럼 chain method로 코드를 작성하는 습관을 들이시면 원본을 덮어쓰지 않아도 문제가 없습니다.

df2.rename(columns={' 주가':'주가'}).sort_values('주가')

 

 

KeyError는 쉽게 확인할 수 있습니다.

 

잊지 마세요!

KeyError = 열이 없다.

믿으세요!

KeyError = 열이 없다.

 

 

열이 없다는 것을 받아들이시기만 하면 쉽게 에러를 찾을 수 있습니다.

 

KeyError를 해결 못하는 가장 큰 이유는

열이 없다고 에러 메세지로 알려주지만, 해당 열은 분명히 존재한다고 생각하는 잘못된 믿음입니다.

 

그래서 그 잘못된 믿음을 깨기 위해 print 함수로 육안으로 확인시켜 주는 것입니다.

사실 해당 열이 존재하지 않는다는 것을 받아들인 분들은 print 함수로 확인할 필요가 없습니다.

잘못된 믿음을 가진 분들이 너무 많기 때문에, 그 분들을 설득하기 위해 print 함수가 필요한 것입니다.

 

 

KeyError는 알기만 하면 쉽게 해결이 가능합니다

이제 KeyError에 고통받지 말고 잘 해결하세요!


 

판다스의 KeyError 시리즈

 

판다스의 KeyError (1) : KeyError 기본편  이번 포스팅

판다스의 KeyError (2) : 판다스의 코드를 chain method로 사용할 때의 KeyError

 

 

 

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

 

 

 

유튜브에서 판다스 강의 중입니다

 

https://www.youtube.com/@KimPandas