NaN과 Blank의 차이점 문의

해결됨
Jason Chung 프로필

강사님 

질문의 꼬리를 물어서 죄송해요^^

우선 강사님 조언대로 적용 해보았는데, 

df['입금'] = df['입금'].str.replace(',','') - 성공

df['입금'] = df['입금'].fillna(0) - 에러없이 작동했는데,df 불러오면 blank 그대로 나옵니다. 0이 아니라..

df['입금'] = df['입금'].astype('int64') - 에러 메세지 invalid literal for int() with base 10: ''

강사님 말씀하신 결측치 때문인거 같아서. pd.to_numeric으로 해보았습니다.

df['입금'] = pd.to_numeric(df['입금']) - Data type float으로 변경 및 Blank 값이 NaN으로 변경
df['입금'] = df['입금'].astype('int64') - 에러 메세지 Cannot convert non-finite values (NA or inf) to integer
그래서 fillna(0) 하고나서 NaN이 0으로 변경후에 astype(int64)를 해주니 변경이 되었습니다.

아래와 같은 의문점이 들어서 질문 드립니다.

1. Blank와 NaN은 다른 건지요? 강사님이 말씀하신 결측치는 Blank인가요. 아님 NaN인가요? 판다스에서는 isnull 메소드 적용시

NaN 값은 인지(True) 하고. Blank는 결과를 못가져 오더라고요.

2. pd.to_numeric 은 float으로 항상 변환해 주는 건지요? 소숫점이 있어서 금액(원화) 하고 맞지 않아서 int로 변경해야

하는데, 결측치를 0으로 만들지 않고(그냥 NaN 유지) int 변경하는 방법은 없는지요?

질문의 의도가 문제를 쉽게 처리하려는 마음은 아니고, 제가 모르는 해결책이 있나 싶어 질문 드립니다.  

박조은 프로필
박조은 2달 전

1. Blank 는 빈문자를 의미하는거 같습니다. 맞나요?

df['입금'] = df['입금'].fillna(0) - 에러없이 작동했는데,df 불러오면 blank 그대로 나옵니다. 0이 아니라..

질문의 이 부분을 보면 비어있는 문자가 그대로 보인다는 건 그 값이 Nan(결측치)가 아니라 이미 비어있는 문자가 들어있다는거에요.

이미 값이 들어있기 때문에 fillna 를 해도 값이 채워지지 않을거에요.

그리고 만약 결측치라면 isnull() 했을때 True 로 표시가 됩니다.

2. pd.to_numeric 으로 변경하면 float 으로 변경이 될텐데 그 이유는 결측치 때문이에요.

type(np.nan) 을 주피터 노트북에서 출력해 보세요. 타입이 float 으로 나와요.

결측치의 데이터 타입이 float 이라서 float 이 하나라도 섞여있으면 다른 값이 다 int 더라도 float 자료형이 됩니다.

int 로 유지하고 싶다면 dropna()로 결측치를 제거해야합니다.

그런데 dropna()로 결측치를 제거하면 필요한 다른 값까지 제거가 될 수 있으니 결측치를 제외한 값만 따로 추출하신 다음에 type을 int 로 변경하시면 될거 같습니다.

Jason Chung 프로필
Jason Chung 2달 전

뭐라고 해야 될지.. 비어있는 문자가 들어가 있다니... NaN이 결측치이고 비어있는 것은 Isnull로 해도 보이지 않네요.

박조은 프로필
박조은 2달 전

보통 공백문자는 눈으로는 잘 보이지 않습니다.

스페이스 바를 하나 넣더라도 눈으로 봤을 때는 결측치 같지만 기계 입장에서는 스페이스바(공백)로 읽게 됩니다.

해당 문자를 복사해서 df["금액"] == "복사한공백문자" 로 찾으면 True 값으로 찾으실 수 있을거에요.

하지만 굳이 찾을 필요가 없는 경우가 많아서 pd.to_numeric 으로 하면 이런 문자들은 알아서 결측치로 변환을 해주게 됩니다.

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스