결측치 또는 빈칸일 경우 셀의 배경을 빨간색(red), 그렇지 않은 경우는 흰색(white)으로 지정하는 사용자 정의 함수 na_fill_01() 를 만들어보자.
1 2 3 4 5 6 7
defna_fill_01(value): if (pd.isna(value)) | (value == ""): fill = "red" else: fill = "white" return"background-color: " + fill
글자 색상 지정을 위해서는 “color”에 값을 지정해야 하나 셀의 배경색이기 때문에 “background-color”에 값을 지정하도록 하였다. 이제 해당 함수를 DataFrame 객체에 적용해보자.
1
df.style.applymap(na_fill_01)
A
B
C
D
0
-1.085631
0.282978
1
-0.578600
1.651437
-2.426679
-0.428913
2
1.265936
-0.678886
제대로된 결과가 나온 것 같지만 row 인덱스가 0과 2인 것은 옅은회색이 아니라 흰색으로 배경색이 설정되어 사실상 완벽하게 처리되었다고 보기는 어렵다. 그래서 조금 개선된 함수인 na_fill_02() 를 만들어 보자.
1 2 3 4 5 6 7
defna_fill_02(value): if (pd.isna(value)) | (value == ""): fill = "red" else: fill = "inherit" return"background-color: " + fill
“fill” 객체에 입력이 되는 “inherit”는 CSS에서 상위 element의 값을 그대로 상속받는 것으로 “우리가 다루고자 하는 element의 해당 속성은 그대로 두겠다.” 라는 뜻으로 해석할 수 있다. 그럼 na_fill_02() 함수를 DataFrame에 적용해보자.
1
df.style.applymap(na_fill_02)
A
B
C
D
0
-1.085631
0.282978
1
-0.578600
1.651437
-2.426679
-0.428913
2
1.265936
-0.678886
이제 결측치가 아닌 값의 배경이 기존 DataFrame에서 보던 것과 같게 되었다. 그렇다면 여기서 결측의 종류가 더 많으면 어떻게 할 수 있을까? 예를 들어 결측치가 빈칸인 경우도 있지만 하이픈(-)이나 “x”로 표기할 수 있기 때문이다. 이를 실습하기 위해 새로운 데이터를 준비해보자.
그리고 다양한 결측을 처리하기 위한 함수인 na_fill_03() 을 다음과 같이 정의해보자.
1 2 3 4 5 6 7
defna_fill_03(value, color): if (pd.isna(value)) | (str(value) in ["", "-", "x"]): fill = color else: fill = "inherit" return"background-color: " + fill
na_fill_02() 함수에서 입력값인 “value” 객체를 처리하는 부분의 코드가 바뀌었다. 즉, 사용자가 결측치라고 간주하는 값의 목록을 if 조건문에서 지정해준다. 물론 함수의 입력값으로 사용자가 별도의 값을 임의로 입력할 수 있도록 사용자 정의 함수를 생성할 수도 있다. 상기 한수를 적용한 결과는 다음과 같다.