Py) Pandas - Styling-02

Py) Pandas - Styling-02

Python의 Pandas는 Jupyter Notebook에서 출력되는 DataFrame을 꾸밀 수 있도록 styling 이라는 기능을 제공하고 있다. 결측치를 다뤄보자.


이번에는 Pandas DataFrame객체의 값이 결측일 경우 Styling을 활용하여 시각적 효과를 부여하는 방법을 알아보도록 한다.

데이터 준비

먼저 다음과 같이 결측치(NA)와 비어있는 텍스트가 있는 데이터를 준비하도록 한다.

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

np.random.seed(123)
df = pd.DataFrame(np.random.randn(3, 4),
columns = ["A", "B", "C", "D"])
df.iloc[[0, 2], 1] = pd.NA
df.iloc[[0, 2], 3] = ""
df
A B C D
0 -1.085631 <NA> 0.282978
1 -0.578600 1.651437 -2.426679 -0.428913
2 1.265936 <NA> -0.678886

결측치 처리

결측치 또는 빈칸일 경우 셀의 배경을 빨간색(red), 그렇지 않은 경우는 흰색(white)으로 지정하는 사용자 정의 함수 na_fill_01() 를 만들어보자.

1
2
3
4
5
6
7
def na_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
def na_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”로 표기할 수 있기 때문이다. 이를 실습하기 위해 새로운 데이터를 준비해보자.

1
2
3
4
5
6
7
8
np.random.seed(456)
df2 = pd.DataFrame(np.random.randn(3, 4),
columns = ["A", "B", "C", "D"])
df2.iloc[[0, 2], 1] = pd.NA
df2.iloc[[0, 2], 3] = ""
df2.iloc[1, 2] = "-"
df2.iloc[2, 2] = "x"
df2
A B C D
0 -0.668129 <NA> 0.618576
1 1.350509 1.629589 - 0.449483
2 -0.345811 <NA> x

그리고 다양한 결측을 처리하기 위한 함수인 na_fill_03() 을 다음과 같이 정의해보자.

1
2
3
4
5
6
7
def na_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 조건문에서 지정해준다. 물론 함수의 입력값으로 사용자가 별도의 값을 임의로 입력할 수 있도록 사용자 정의 함수를 생성할 수도 있다.
상기 한수를 적용한 결과는 다음과 같다.

1
df2.style.applymap(na_fill_02, color = "#FFAACC")
A B C D
0 -0.668129 0.618576
1 1.350509 1.629589 - 0.449483
2 -0.345811 x

<Python Pandas Styling 시리즈>
Python Pandas Styling - 01
Python Pandas Styling - 02
Python Pandas Styling - 03
Python Pandas Styling - 04

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×