오늘 할 일: 갈고 닦기
article thumbnail

들어가며

오랜만에 파이썬을 사용하다가 유용해보이는 기능을 발견하여 공유하고자 합니다. 바로 pandas의 style 기능입니다. 데이터 분석을 하면 데이터프레임에 찍힌 숫자나 문자와 같은 값들을 보면서 무엇이 제일 크고 작은지, 관심있게 보려는 값이 어디있는지 찾아야하는 일이 생기죠. 이때 내가 원하는 값들이 쉽게 눈에 띄지 않은 경험을 한 번쯤은 해보셨을 것 같습니다. 행, 열이 많아지면 주의 깊게 봐야하는 값이 어디에 있는지 더욱 찾기 어려워지기도 하죠.

이런 일들을 해결하기 위해 데꾸, 데이터프레임 꾸미기를 활용할 수 있습니다. 판다스의 공식 문서를 보며 유용할 것 같은 일부 함수들을 가져와 소개 드립니다.

 

 

비어있는 값, nan 강조하기

import numpy as np 
import pandas as pd
import seaborn as sns
np.random.seed(1234)
df1 = pd.DataFrame(np.random.randn(4, 5), columns=['P', 'A', 'N', 'D', 'S'])
df1.iloc[0, 1] = np.nan
df1.iloc[2, 4] = np.nan
df1.loc[:4].style.highlight_null(color='yellow')

nan 강조 전, 후

 

비어있는 상태를 그냥 출력했을 때, highlight_null 함수를 이용했을 때를 비교해보면 nan이 확실하게 눈에 띄는 것을 알 수 있습니다. 비어있는 값이 있는지 데이터프레임을 보며 하나하나 찾기 보다는, 하이라이트 함수를 활용하여 확인해보세요. 눈의 피로를 줄일 수 있을 것입니다. 

 

 

범위 내에 있는 값 강조하기

left = pd.Series([-0.5, 0.0, -1.0], index=["P", "A", "D"])
right = pd.Series([0.5, 3.0, 0.0], index=["P", "A", "D"])
df1.style.highlight_between(left=left, right=right, axis=1, props='color:white; background-color:purple;')

 

특정 범위에 속하는 값을 찾아서 강조할 수도 있습니다. highlight_between 함수를 이용해 범위 기준 값 left, right를 설정하고 적용해보세요. 예시처럼 컬럼마다 다른 값을 정해줄 수도 있지만 고정된 값을 줄 수도 있고, left, right 중 하나만 정할 수도 있습니다. props 파라미터를 통해 원하는 출력 형태를 설정해주면 더 보기 좋은 결과를 얻을 수 있습니다.

 

 

최댓값, 최솟값 강조하기

np.random.seed(234)
df2 = pd.DataFrame({
    'class': ['a'] * 20 + ['b'] * 20 + ['c'] * 20,
    'value': np.random.normal(size=60)
})
desc = df2.groupby('class').describe()
desc.style.highlight_max(axis=0, color='yellow')

 

그룹별 통계값을 계산하고, 어떤 그룹에서 최솟값, 최댓값을 갖고 있는지 확인하기 위해 샘플 데이터를 먼저 만들었습니다. groupby로 그룹별 통계값을 얻은 후, highlight_max 함수를 이용하여 최댓값을 먼저 강조해보았습니다. 

 

desc.style.highlight_min(axis=0, color='lightblue')

 

최솟값을 강조하기 위해서는 highlight_min 함수를 마찬가지로 적용합니다. 

 

desc.style.highlight_max(axis=0, color='yellow').highlight_min(axis=0, color='lightblue')

 

두 함수를 동시에 적용하여 최댓값과 최솟값을 함께 확인할 수도 있습니다. 이 함수들은 다른 때보다 위 상황처럼 그룹별 기술 통계를 확인할 때 유용하게 적용할 수 있을 것입니다.

 

 

셀 안에 bar chart 그리기

desc.style.bar(subset=[('value', 'mean'), ('value', '50%')], color=['red', 'skyblue'])

 

bar 함수를 이용하면 셀 안에서 값을 시각화할 수도 있습니다. 단순하게 어떤 값을 갖고 있는지를 넘어서, 값이 음수인지 양수인지, 다른 값과 비교했을 때 절대적인 크기가 어떻게 다른지를 이해하기 쉽게 표현해줍니다. 

 color는 위 예시처럼 정해진 색상의 이름을 써줄 수도 있지만, 다양한 표현을 원한다면 hex 정보를 작성해줄 수도 있습니다. Hex 검색 사이트에서 원하는 색상의 hex를 얻은 후에 활용해보아도 좋겠습니다.

 

desc.style.bar(subset=[('value', 'mean'), ('value', '50%')], color=['#ff8000', '#319d17'])

 

 

값에 따라 색깔을 이용해 강조하기

np.random.seed(5678)
df3 = pd.DataFrame(np.random.randn(100, 5), columns=['P', 'A', 'N', 'D', 'S'])
cm = sns.color_palette("mako_r", as_cmap=True)
df3.corr().style.background_gradient(cmap=cm)

 

상관관계 결과 분석에 유용할 것 같은 함수들입니다. background_gradient 함수, text_gradient 함수를 사용하면 값의 크기에 따라 셀 음영이나 텍스트의 색상을 다르게 줄 수도 있습니다. 함수에 팔레트를 지정해주면 각각 셀 음영, 텍스트의 색상을 팔레트가 가진 색깔 스펙트럼을 이용해 변경해줍니다. 사용가능한 팔레트는 seaborn 공식문서를 참고하여 확인할 수 있습니다. 단, 값의 크기에 따라 스무스하게 색상이 변경되어야하기 때문에, 팔레트 설정 시 as_cmap은 True로 설정해야 합니다.

 

df3.corr().style.text_gradient(cmap=cm)

 

 

마치며

지금까지 데꾸(데이터프레임 꾸미기)에 유용한 함수들을 알아보았습니다. 여기에 소개된 함수들은 판다스가 제공하는 데꾸 함수들 중 일부입니다. 위 예시들은 빠르게 실전에 적용하여 데이터 분석 결과를 보다 직관적으로 이해하는 데에 사용하실 수 있을 것입니다. 공식문서에는 데이터프레임에 캡션을 달거나, 셀 테두리를 굵게 만들거나, CSS까지 활용할 수 있도록 여러가지 사례가 소개되어 있으니 보다 커스텀하는 내용을 원한다면 공식문서를 참고 바랍니다. 

 

 

참고

https://pandas.pydata.org/docs/user_guide/style.html

 

Table Visualization — pandas 2.0.3 documentation

Some styling functions are common enough that we’ve “built them in” to the Styler, so you don’t have to write them and apply them yourself. The current list of such functions is: The individual documentation on each function often gives more exampl

pandas.pydata.org