캐글 커널 필사 중에 발견된 버그(아래의 커널을 필사한 과정에서 발생함)

https://www.kaggle.com/bertcarremans/data-preparation-exploration

 

Data Preparation & Exploration

Explore and run machine learning code with Kaggle Notebooks | Using data from Porto Seguro’s Safe Driver Prediction

www.kaggle.com

 

유한님 유튜브를 시청하며 공부하던 중에 자꾸 결과가 달라서 추적해봄.

https://www.youtube.com/watch?v=ysR7daBSEy8&list=PLC_wC_PMBL5NLKkMooi-n4iK4gv3VqXyo&index=2

 

결론적으로 뭐가 문제냐면

리스트에 값을 추가하는 반복문에 조건문이 있었음.

근데, 조건문에 해당 컬럼의 dtype가 int가 맞는데도 불구하고 자꾸 False가 뜨니까

데이터프레임을 만들어도 뭔가 결과창이 안맞아!!

그래서 문제인 부분을 끝끝내 찾았습니다.

해당 컬럼에 대해서 실험을 해보았음

 

그래서 해당 컬럼이 int인지 불린식을 적용해보았더니 False가 뜨는 것이 아닌가...?

저 컬럼은 분명히 int64라고 찍혀있습니다만...? (int64로 해버리면 변수로 인식되서 에러뜸)

웃긴건 float64는 어떻게 쓰든간에 True로 나옵니다만...?

그래서 캐글코리아 카톡에 질문을 해봤더니 여러분들이 고민을 해주심

캐글코리아 카카오톡에 질문

 

웃긴건 isinstance에서 int 대신 object로 불린을 하면 True로 나옴!!

더 웃긴건 .dtype로 object를 해보면 False로 나옴ㅋㅋㅋㅋ

어떤 분의 의견으로 np.int64로 해보니 dtype는 되고, isinstance는 또 안된다. 

여튼 여기서 시간을 얼마나 쓴지 모르겠지만,,,,

버그인것으로 잠정적 결론?

유튜브로 스터디 해주신 이유한님의 반응

 

어휴 이미 스터디 끝난듯한 피로감... 

판다스여 영원하라 ~ 버그없이 ~

 

 

가끔가다 데이터프레임에서 컬럼 이름을 변경해야 하는 경우가 있습니다.

 

여기서는 크게 두가지의 경우를 살펴볼 것입니다.

feature(열)의 크기가 작다면 둘 중 어느방법을 사용해도 상관 없습니다

다만, 특정 컬럼만 매칭해서 바꾸고 싶은 경우에는 rename()메소드로 컬럼 인자를 반환해줘야 합니다.

설명보다는 예시로 들어가봅시다.

 

데이터프레임을 생성합니다.

df = pd.DataFrame({

    'a': [4, 5, 6],
    'b': [7, 8, 9],
    'c': [10, 11, 12]},
    index = [1, 2, 3]
)

df

컬럼명들을 'A', 'B', 'C'로 바꾸고 싶다고 가정하면,

크게 두가지 방법이 있습니다.

1. df.columns = [] 리스트 형태로 반환하거나, 

2, df.rename(columns={}) 딕트 형태로 반환하는 방법입니다.

 

차이점이 있습니다.

리스트 형태는 반드시 모든 피처들을 입력해줘야 됩니다.

즉, 열의 피처 개수만큼 리스트 인자가 들어가 있어야 된다는 거죠.

하나라도 부족하면 에러가 뜨게 됩니다.

df.columns = ['A', 'B', 'C']

성공적으로 바뀌었습니다. 

 

바뀌기 전의 데이터프레임에서

df.columns의 리스트 인자를 피처 개수 3개보다 적게 입력해주면 어떻게 될까요?

 

새롭게 데이터 프레임을 초기화 합니다.

df = pd.DataFrame({

    'a': [4, 5, 6],
    'b': [7, 8, 9],
    'c': [10, 11, 12]},
    index = [1, 2, 3]
)

리스트 인자를 기존 피처개수 3개보다 적은 2개로 입력해보겠습니다.

df.columns = ['A', 'B']

하단 에러를 보세요.

에러를 보시면. "열은 3개인데, 너는 2개만 값을 입력했다" 라는 에러메시지가 뜹니다.

즉 df.columns = [] 방식으로는 반드시 컬럼의 개수를 맞춰줘야 됩니다.

 

그러면 두번째 방법을 살펴보죠.

df.rename(columns={})

rename의 파라미터인 columns를 딕트 형태로 반환하는 겁니다.

여기서 키 값은 기존의 컬럼이름이고, 밸류 값은 새롭게 지정하고 싶은 이름입니다.

다행히도 이 방법은 반드시 3개의 인자를 모두 반환할 필요가 없습니다.

키 값을 지정해준 부분만 바꿔주기 때문입니다.

(기존 df에 적용시키기 위해 inplace=True 인자를 넣어줍시다.)

df.rename(columns = {'A':'에이', 'B':'비', 'C':'씨'}, inplace=True)

모든 컬럼의 이름이 바뀌었네요.

그러면 'C' 컬럼은 바꾸지 않도록 하기 위해서 왼쪽부터 두 열만 바꿔봅시다.

df.rename(columns = {'A':'에이', 'B':'비'}, inplace=True)

아까 리스트 형태로는 반드시 모든 컬럼의 갯수만큼 반환해야 했는데,

딕트 형태로 파라미터를 반환하는 rename() 함수는 필요한 피처의 이름만 바꿀 수 있어서 좋네요.

 

요약

컬럼 네임을 바꾸는 방법이 두가지가 있다.

 

1. df.columns = [] 형태로 리스트를 반환하는 방법

이것은 반드시 리스트의 len()과, df의 열의 길이가 동일해야 한다는 점.

 

2. df.rename(columns={}) 형태로 딕트를 반환하는 방법

이것은 모든 열을 다루지 않고, 필요한 열만 키 값으로 지정해서 바꿔줄 수 있다.

 

 

+ Recent posts