MINERVA/Python 2023. 2. 11. 09:56
반응형

프로그램 테스트를 진행 하다가 예상치 못한 동작이 발견되어, 원인을 파악해 보니, 공백 처리가 미진하게 되어 발생되었음을 확인하게되었습니다. 이 이슈는 정말 아주 아주 오랜(?)만에 경험하게 되었습니다.

 

공백(Blank)는 두가지 의미로 생각해야 합니다.

진짜 아무것도 없다? 아니면, 화면에 보이지 않는 어떤 값이 있는건지?

 

간단히 생각의 흐름대로 아래와 같이 정리하여 보았습니다.

 

1. 예제 데이타

- 기대한 데이타: 값이 없는 경우(ex: 공백 등) 모두 0으로 설정( dataframe = dataframe.fillna(0))

- 예상치 못한 데이타: 아래와 같이 0으로 변경되지 않고 빵구(?),  정체 불명의 공백이 그대로 있음

    저 공백에는 머가 있는거지?

아이템           경험가중치
0                  0
1                  0
2                  0
:                  :
60                 0
61                 0
62                 
63                 
64                 0
65                 0
66                 
67                 
68                 0
:                  :
:                  :
106                0
107                0
108                0
109                
110                0
111                
112                0
:                  :
127       6,243,841
128      23,787,440
129      11,598,306
130       5,240,070
131       5,933,144
:                  :
:                  :

2. 빵구(?) 정체 확인 

 

2.1 접근1

-  아래와 같이 null 이 있는지 확인

print(expDf.info())
print(expDf.isnull())
RangeIndex: 2690 entries, 0 to 2689
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   경험가중치   2690 non-null   object
dtypes: object(1)
memory usage: 21.1+ KB
None
      경험가중치
0     False
1     False
2     False
3     False
4     False
:      :
:      :
2688  False
2689  False

- 위와 같이, 공백이 없다는 것을 확인함. 

 

2.2 접근2

- 각 컬럼 값의 길이를 찍어 봄

print(expDf['경험가중치'].str.len())
0        NaN
1        NaN
:         :
61       NaN
62       2.0
63       2.0
64       NaN
65       NaN
66       2.0
67       2.0
68       NaN
:        :
:        :
108      NaN
109      2.0
110      NaN
111      2.0
112      NaN
:        :
124      NaN
125      NaN
126      NaN
127     10.0
:       :
2688    11.0
2689    11.0

-  길이를  확인하여 보니, 어떤 값이 들어 가 있다는 것을 확신하게 됨

 

2.3 접근3

- 해당 행(62번행)  hex값을 확인함

print(expDf['경험가중치'].iloc[62])

print(type(expDf['경험가중치'].iloc[61]))
print(type(expDf['경험가중치'].iloc[62]))

# str -> hex
# value = ''.join(format(ord(i), '08b') for i in expDf['경험가중치'].iloc[62])
#print(str(value))
print(expDf['경험가중치'].iloc[62].encode('utf-8').hex())
<class 'int'>
<class 'str'>
c2a020

- 값을 확인해 보면, 62번 행은 string 타입이고, 이 값의 hex값을 위와 같이 확인할수 있다.

  그리고, hex값 20은 SPACE를 의미 한다는 것을 확인할수 있게 됨

 

3. 해결방법

- 원인 확인: 해당 공백이 SPACE에 의해서 발생했음을 확인함.

expDf['경험가중치'] = expDf['경험가중치'].replace(r'^\s+$', np.nan, regex=True)
expDf['경험가중치'] = expDf['경험가중치'].replace(np.nan, 0)

- 'SPACE' 공백을 NaN으로 전환하고, 이 값을 0으로 바꿈

아이템             경험가중치
:                    :
59                   0
60                   0
61                   0
62                   0
63                   0
64                   0
65                   0
66                   0
67                   0
:                    :

정상적으로 결과를 나왔음을 확인

 

4. 결과

- NULL관련된 이슈는 참으로 오래된 이슈(?)여서 재밌기도 하였지만, 느닷없이 발생했을때는 좀 놀랐네요.

 

반응형
posted by choiwonwoo
: