Streamlit DataFrame: Pandas DataFrame 표시, 스타일링 및 최적화 (2025 업데이트)
데이터 과학 분야에서 데이터 시각화와 상호작용 능력은 매우 중요합니다. Streamlit이라는 Python 라이브러리는 단 몇 줄의 코드로 데이터가 풍부한 웹 애플리케이션을 만드는 방식을 혁신했습니다. Streamlit의 가장 강력한 기능 중 하나는 Pandas DataFrame과의 매끄러운 통합입니다. 이 문서에서는 Streamlit DataFrame의 세계를 살펴보며, Pandas DataFrame을 표시하고 스타일링하며 최적화하는 방법을 최신 Streamlit 기능(2025년 기준)에 맞춰 튜토리얼 형식으로 쉽게 따라갈 수 있게 설명합니다.
Streamlit DataFrame이란?
Streamlit DataFrame은 Streamlit 앱 내에서 Pandas DataFrame(또는 유사한 표 형식 데이터)을 표시하는 것을 말합니다. 노트북의 정적인 표를 웹 앱의 인터랙티브 요소로 옮긴 것과 같습니다. 내부적으로 Streamlit은 Pandas(또는 PyArrow, Polars 같은 다른 자료구조)를 사용해 데이터를 관리하지만, 이를 웹 친화적인 인터페이스로 래핑합니다. Pandas DataFrame은 2차원 레이블된 데이터 구조로 데이터 과학에서 널리 사용됩니다. Streamlit은 Pandas를 기반으로 DataFrame을 실시간으로 상호작용할 수 있게 표시하고 조작할 수 있는 플랫폼을 제공합니다. 단순히 표를 보는 대신, 컬럼 정렬, 데이터 필터링, 중요한 값 강조, 사용자 편집 등 다양한 작업을 Streamlit의 직관적인 컴포넌트를 통해 수행할 수 있습니다.
Streamlit DataFrame 튜토리얼
Streamlit 앱을 쉽게 Tableau처럼 바꿔주는 멋진 데이터 분석 및 시각화 도구를 들어보셨나요?
PyGWalker (opens in a new tab) 는 사용자가 자신의 Streamlit 앱에 tableau 대체 UI를 손쉽게 임베드할 수 있게 도와주는 Python 라이브러리입니다. 자세한 단계는 이 멋진 동영상 how to explore data with pygwalker (opens in a new tab)을 확인해 보세요 — Streamlit 앱에 이 강력한 Data Visualization Python Library를 적용하는 방법을 보여줍니다!
Streamlit DataFrame 시작하기
먼저 Streamlit이 설치되어 있는지 확인하세요. pip으로 설치할 수 있습니다:
pip install streamlitPython 스크립트에서 Streamlit과 데이터 처리를 위한 Pandas를 임포트합니다:
import streamlit as st
import pandas as pd다음으로 표시할 간단한 DataFrame을 생성해 보겠습니다. 예를 들어 과일 데이터셋을 사용해봅시다:
data = {
"Fruit": ["Apple", "Banana", "Cherry", "Date", "Elderberry"],
"Quantity": [10, 15, 20, 25, 30],
"Price": [0.5, 0.25, 0.75, 1.0, 2.0]
}
df = pd.DataFrame(data)이제 이 DataFrame을 Streamlit 앱에 표시하려면 st.dataframe() 함수를 사용하세요:
st.dataframe(df)Streamlit 앱을 실행하면(streamlit run your_script.py) DataFrame이 인터랙티브 테이블로 렌더링됩니다. 컬럼 헤더를 클릭해 정렬할 수 있고, 오른쪽 아래 모서리를 드래그해 테이블 크기를 조절할 수 있습니다. 최신 Streamlit 버전에서는 툴바에 데이터 검색, 클립보드 복사, CSV 다운로드 등의 기능이 포함되어 있습니다. 기본적으로 st.dataframe은 최대 약 10개 행을 표시하도록 높이를 조절하고, 더 많은 행이 있을 경우 테이블 내부에 스크롤이 생깁니다. 이 기본 예제는 시작하기 얼마나 쉬운지 보여줍니다. 다음으로 디스플레이를 사용자화하고 큰 데이터셋을 처리하는 방법을 살펴보겠습니다.
Streamlit에서 DataFrame 표시하기
DataFrame을 인터랙티브 테이블로 표시하는 방법
위에서 본 것처럼 Streamlit에서 DataFrame을 표시하는 것은 st.dataframe(df)를 호출하는 것만큼 간단합니다. 하지만 단순히 표를 보여주는 것 이상의 기능을 제공합니다 — Streamlit은 DataFrame의 모양과 인터랙티비티를 사용자화할 수 있게 합니다. 크기 조절: DataFrame 컴포넌트의 크기를 앱 레이아웃에 맞게 설정할 수 있습니다. 예를 들어 테이블 표시 높이를 픽셀 단위로 제한하려면:
st.dataframe(df, height=300)위 코드에서 DataFrame은 수직 공간 300픽셀을 차지합니다(대략 한 번에 ~10행을 표시). DataFrame에 더 많은 행이 있으면 테이블 내부에 스크롤바가 나타납니다. 너비도 제어할 수 있습니다. 최근 버전에서는 st.dataframe이 width 파라미터를 지원하며(width="stretch"로 컨테이너의 전체 너비로 확장 가능), 예를 들어:
st.dataframe(df, width="stretch", height=300)이렇게 하면 테이블이 앱 컬럼/컨테이너의 전체 너비로 확장되고 높이는 고정됩니다. (참고: 이전의 use_container_width=True 파라미터는 최신 Streamlit API에서는 width="stretch"로 대체되어 있습니다.)
인터랙티브 기능: Streamlit의 DataFrame 표시 기능은 정적이지 않으며, 인터랙티브 데이터 그리드로 동작합니다. 사용자는 테이블 UI에서 다음과 같은 작업을 직접 수행할 수 있습니다:
- 컬럼 정렬: 컬럼 헤더를 클릭해 오름차순/내림차순 정렬.
- 컬럼 크기 조절 및 순서 변경: 컬럼 경계를 드래그해 크기 조절, 헤더를 드래그해 순서 변경 또는 고정.
- 컬럼 숨기기: 헤더의 오버플로우 메뉴(보통 "⋮")로 특정 컬럼을 숨기거나 표시.
- 검색: 테이블 툴바의 검색 박스(또는 Ctrl+F/Cmd+F)를 사용해 DataFrame 전체에서 항목 검색.
- 복사 및 다운로드: 셀을 선택하고 Ctrl+C/Cmd+C로 복사하거나 툴바의 다운로드 버튼으로 CSV로 다운로드.
이 모든 기능은 st.dataframe을 사용할 때 기본으로 제공되어 데이터 탐색에 강력한 도구가 됩니다.
데이터 강조 및 조건부 서식 적용
종종 DataFrame에서 특정 값에 주목하게 하고 싶을 때가 있습니다. 이럴 때는 Pandas Styler를 사용해 조건부 서식을 적용한 뒤 표시하는 것이 편리합니다. Streamlit은 Pandas Styler 객체를 렌더링하는 것을 지원하므로 highlight_max, highlight_min, background_gradient 같은 메서드를 사용한 스타일링을 적용한 뒤 Streamlit으로 전달할 수 있습니다. 예를 들어 각 컬럼의 최댓값을 강조하려면:
st.dataframe(df.style.highlight_max(axis=0))이 예제에서는 각 컬럼의 가장 큰 값이 기본 하이라이트 스타일로 강조됩니다. 스타일링을 더 커스터마이즈하거나 다른 Styler 메서드를 사용할 수 있습니다. 또 다른 예로 컬럼 값에 기반한 색상 그라디언트를 적용하려면:
st.dataframe(df.style.background_gradient(cmap="Blues"))이렇게 하면 값의 크기에 따라 셀 배경이 연한 파랑에서 진한 파랑으로 색칠되어 분포를 한눈에 파악하는 데 도움이 됩니다. Streamlit은 이러한 스타일링된 DataFrame을 표시하지만, Pandas의 일부 고급 스타일(셀 내 막대그래프나 툴팁 등)은 Streamlit 테이블에서 완전히 지원되지 않을 수 있습니다. 그러나 색상, 텍스트 및 기본 포맷팅 같은 일반적인 스타일링은 대부분 잘 작동합니다.
Streamlit에서 큰 DataFrame 다루기
수천 행, 심지어 수백만 행의 대규모 DataFrame을 다루는 것은 어떤 웹 앱에서도 도전 과제입니다. Streamlit의 테이블 컴포넌트는 성능을 위해 설계되어 있고 가상화(보이는 부분만 렌더링)와 HTML canvas 기반 렌더링을 사용해 매우 큰 데이터셋을 처리할 수 있습니다. 하지만 거대한 데이터를 다룰 때는 여전히 실무적인 고려사항과 한계가 있습니다:
- 브라우저 및 네트워크 한계: 일반적으로 전체 데이터는 Streamlit 서버에서 브라우저로 전송되어야 합니다. 매우 큰 데이터셋은 WebSocket 메시지 크기 제한에 걸리거나 브라우저 메모리를 소진할 수 있습니다. 예를 들어 백만 행의 DataFrame을 전송하려고 하면 앱이 처리할 수는 있지만 전송과 렌더링에 시간이 많이 걸릴 수 있습니다.
- 자동 최적화: Streamlit은 큰 테이블의 반응성을 유지하기 위해 특정 기능을 자동으로 비활성화합니다. 예를 들어 데이터셋이 ~150,000행을 넘으면 렌더링 속도를 위해 컬럼 정렬을 끕니다. 아주 큰 테이블은 성능 문제를 피하기 위해 모든 인터랙티브 기능을 지원하지 않을 수 있습니다.
- 대용량 데이터에 대한 권장 방식:
- 데이터의 하위집합 표시: 한 번에 전체 거대한 DataFrame을
st.dataframe에 던지는 대신 필터링되거나 샘플된 하위집합을 보여주세요. 예를 들어 사용자가 볼 컬럼이나 날짜 범위를 선택하게 하거나, 첫 N행만 표시하고 페이지 방식으로 탐색하도록 옵션을 제공할 수 있습니다. - 간단한 페이지네이션 구현: 수동으로 페이지네이션을 만들 수 있습니다. 한 방법은 슬라이더나 숫자 입력으로 페이지 인덱스를 받아 DataFrame을 슬라이스하는 것입니다:
- 데이터의 하위집합 표시: 한 번에 전체 거대한 DataFrame을
page_size = 100 # rows per page
total_rows = len(df)
total_pages = (total_rows - 1) // page_size + 1
page = st.number_input("Page", min_value=1, max_value=total_pages, value=1)
start_idx = (page - 1) * page_size
end_idx = start_idx + page_size
st.write(f"Showing rows {start_idx} to {min(end_idx, total_rows)}")
st.dataframe(df.iloc[start_idx:end_idx])이 예시에서는 사용자가 페이지 번호를 선택해 한 번에 100행 단위의 청크를 볼 수 있습니다. 이렇게 하면 전체 DataFrame을 한 번에 렌더링하려는 시도를 피해 반응성을 개선할 수 있습니다.
- 지연 평가(lazy) 데이터프레임 활용: Streamlit은 PySpark나 Snowflake(Snowpark) DataFrame 같은 소스의 데이터를 표시할 수 있습니다. 이러한 데이터 구조는 필요할 때만 데이터를 가져오므로 필터나 제한을 적용하면 백엔드(예: 데이터베이스나 Spark 엔진)에서 처리가 일어나고 제한된 결과만 Streamlit으로 전송됩니다. 데이터셋이 매우 크고 데이터베이스나 빅데이터 플랫폼에 저장되어 있다면, 모든 데이터를 Pandas DataFrame으로 메모리에 로드하기보다 청크로 쿼리하거나 지연 평가 방식을 사용하는 것을 고려하세요.
- 데이터 로딩에 캐시 사용: (이후 섹션에서 캐싱을 자세히 다루겠지만 요약하자면, 큰 데이터셋을 반복적으로 읽는 것을 피하기 위해 데이터 가져오기 단계를 캐시하세요.)
이러한 전략을 염두에 두면 Streamlit에서 대규모 데이터를 보다 원활하게 처리할 수 있습니다. 핵심은 한 번에 프런트엔드에 너무 많은 데이터를 보내지 않는 것이며 Streamlit의 성능 기능을 활용하는 것입니다.
Streamlit에서 DataFrame 스타일링
데이터를 표시하는 것과 가독성이 좋게 보이도록 만드는 것은 별개입니다. Streamlit은 내장 포맷 옵션부터 커스텀 CSS(몇 가지 주의사항 있음)까지 다양한 방식으로 DataFrame을 스타일링할 수 있게 합니다. 테이블의 가독성을 향상시키는 방법을 알아봅시다.
Streamlit에서 CSS로 DataFrame을 스타일링할 수 있나요?
웹 페이지에서처럼 DataFrame에 커스텀 CSS 스타일을 적용할 수 있을지 궁금할 수 있습니다. 짧게 말하면 가능합니다만 주의가 필요합니다. Streamlit은 st.markdown과 unsafe_allow_html=True 플래그를 사용해 HTML/CSS를 앱에 주입할 수 있습니다. 따라서 테이블 요소를 대상으로 CSS를 시도할 수 있습니다. 예를 들어 테이블 배경 색을 변경하려면:
st.markdown(
"""
<style>
table { background-color: #f0f0f0; }
</style>
""",
unsafe_allow_html=True
)
st.dataframe(df)이 스니펫은 <style> 블록을 삽입해 모든 HTML <table>의 배경을 연회색으로 설정한 뒤 st.dataframe(df)를 호출합니다. 기본적으로 데이터 렌더링이 표준 HTML 테이블 요소를 사용한다면 이것이 영향을 줄 수 있습니다. 그러나 다음 사항을 유의하세요:
- 이 방법은 공식적으로 권장되는 방식이 아니며 Streamlit의 내부 구현이 변경되면 깨질 수 있습니다. 사실 최신 Streamlit의
st.dataframe은 데이터 셀에 단순 HTML 테이블을 사용하지 않고 HTML canvas 기반으로 렌더링하는 경우가 많아 일부 CSS 선택자가 적용되지 않을 수 있습니다. unsafe_allow_html=True를 사용하는 것은 일반적으로 빠른 해킹 용도가 아니면 권장되지 않습니다. 전역적으로 스타일을 바꿔 의도치 않은 보안 또는 안정성 문제를 일으킬 수 있기 때문입니다.
요약하면, 경미한 스타일 조정(배경색이나 글꼴 스타일 설정 등)은 CSS로 가능하지만, 가능한 경우 Streamlit의 내장 스타일 기능을 사용하는 것이 더 안전합니다.
Pandas와 Column Config로 Streamlit DataFrame 스타일링하기
Streamlit에서 DataFrame을 스타일링하는 더 안정적인 방법은 Pandas Styler(앞 섹션의 highlight_max, background_gradient 등)나 Streamlit의 컬럼 구성 옵션을 사용하는 것입니다. Pandas Styler: Pandas가 제공하는 많은 스타일링 함수를 적용할 수 있습니다. 예를 들면:
df.style.format(format_dict)– 각 컬럼의 숫자나 날짜 포맷 지정(예: 소수를 퍼센트나 통화로 표시).df.style.applymap(func)– 요소별로 스타일링 함수 적용(예: 음수는 빨간색으로).df.style.set_properties(**props)– 특정 셀에 CSS 속성 설정(단, 모두 Streamlit으로 완전히 이월되지는 않을 수 있음).df.style.hide(axis="index")– 인덱스가 표시할 의미가 없을 때 숨기기.
Pandas로 DataFrame을 스타일링한 다음 Styler 객체를 st.dataframe()에 전달하면 됩니다. 컬럼 구성(column_config): Streamlit(특정 버전 이후)은 st.dataframe과 st.data_editor에 대해 column_config 파라미터를 도입해 컬럼이 어떻게 표시될지를 사용자화할 수 있게 했습니다. 이는 다음과 같은 작업을 Python 코드로 지정할 수 있게 합니다:
- 컬럼 레이블(표시용 이름) 설정(원본 DataFrame을 변경하지 않고 표시명만 바꿈).
- 특정 컬럼 숨기기.
- 표시 방식 지정(예: 이미지 컬럼, 링크 컬럼, 체크박스, Datetime 등으로 표시 형식 변경).
- 숫자나 날짜 포맷 지정(Styler와 유사하지만 Streamlit API를 통해 수행).
예를 들어, DataFrame에 가격 컬럼이 있고 이를 미국 통화 형식으로 표시하고 컬럼 헤더를 바꾸고 싶다면:
import streamlit as st
import pandas as pd
df = pd.DataFrame({
"item": ["A", "B", "C"],
"price": [1.5, 2.0, 3.25]
})
st.dataframe(
df,
column_config={
"price": st.column_config.NumberColumn(
"Price (USD)",
format="$%.2f"
)
}
)이 스니펫에서는:
price컬럼의 표시명을Price (USD)로 바꿨습니다.- 해당 컬럼의 숫자를 달러 기호와 소수점 둘째 자리로 포맷했습니다.
이 방법은 커스텀 CSS 없이도 깔끔하게 포맷된 테이블을 제공하며 Streamlit의 인터랙티브 그리드와 잘 연동됩니다. 컬럼을 숨기려면 컬럼 구성에서 해당 컬럼을 None으로 설정하거나, 이미지나 불리언 등 다른 타입의 컬럼 구성 타입을 사용할 수도 있습니다. 요약하자면, 가능한 경우 Pandas Styler 또는 Streamlit의 컬럼 구성을 사용하세요 — 이는 원시 CSS를 주입하는 것보다 더 안정적이고 표현력이 좋습니다.
Streamlit에서 DataFrame 최적화
더 복잡한 앱을 만들거나 더 큰 데이터셋을 다루다 보면 성능이 중요해집니다. 이 섹션에서는 캐싱과 기타 모범 사례에 중점을 두어 Streamlit에서 DataFrame 사용을 속도와 효율성 측면에서 최적화하는 방법을 다룹니다.
Streamlit에서 Pandas DataFrame을 최적화하는 방법
여기서 최적화는 앱의 성능(로드 시간, 반응성)과 리소스 사용(메모리 등) 최적화를 모두 의미합니다. 주요 전략은 다음과 같습니다:
데이터 로딩 및 계산에 Streamlit 캐시 사용: 앱을 빠르게 만드는 가장 간단한 방법 중 하나는 비용이 큰 연산을 반복하지 않는 것입니다. 큰 데이터셋을 CSV나 데이터베이스에서 매번 로딩하면 느려집니다. Streamlit은 이를 돕기 위해 캐싱 메커니즘을 제공합니다. 이전 버전에서는 @st.cache를 사용했지만, 현재 Streamlit에서는 데이터를 반환하는 함수(예: DataFrame)를 캐시할 때 @st.cache_data를 사용해야 합니다. 예:
import pandas as pd
import streamlit as st
@st.cache_data
def load_data():
# Imagine this is an expensive operation, e.g., reading a large CSV
df = pd.read_csv("large_dataset.csv")
# (You could do additional processing here if needed)
return df
# Use the cached function to load data
df_large = load_data()
st.dataframe(df_large.head(100)) # Display just first 100 rows as an example@st.cache_data를 사용하면 첫 실행 시 CSV를 읽고 생성된 DataFrame을 캐시에 저장합니다. 이후 실행(또는 사용자가 앱을 다시 실행)에서는 함수 입력이 변경되지 않는 한 load_data()를 다시 실행하지 않고 캐시에서 DataFrame을 가져옵니다. 이는 동일한 데이터를 반복적으로 사용할 때 앱을 크게 빠르게 합니다.
DataFrame 크기와 타입 최적화: 큰 DataFrame은 적절한 데이터 타입을 사용하면 최적화될 수 있습니다. 예를 들어 범주형 텍스트 데이터는 Pandas의 Categorical 타입으로 변환하면 메모리를 절약할 수 있습니다. 0/1 또는 True/False만 필요하면 정수 대신 불리언 타입을 사용하세요. 높은 정밀도가 필요하지 않은 부동 소수점은 float32로 다운캐스트할 수 있습니다. 이런 pandas 최적화는 메모리 사용량을 줄여 Streamlit에서의 성능을 간접적으로 향상시킵니다(리소스 제한이 있는 서버에서 특히 중요).
효율적인 데이터 포맷 사용: 데이터 소스를 제어할 수 있다면 Parquet나 Arrow 같은 이진 포맷을 사용하면 CSV보다 로딩이 더 빠릅니다. Streamlit은 Arrow 테이블을 직접 읽어 효율적으로 처리할 수 있습니다. 이는 캐시와도 연결됩니다 — 예를 들어 Parquet 파일을 읽어 캐시해 두면 처음 로드 속도 자체가 빠릅니다.
이제 캐싱과 성능 팁을 좀 더 자세히 살펴보겠습니다. 캐싱은 최적화에서 매우 중요합니다.
Streamlit DataFrame 캐싱 및 성능 팁
캐시는 Streamlit에서 강력한 도구이지만 올바르게 사용하는 것이 중요합니다. 다음은 캐싱과 성능에 대한 팁 및 모범 사례입니다:
적절한 캐시 데코레이터 선택: 데이터 계산이나 쿼리(데이터프레임, 리스트, 딕셔너리 등을 반환하는 함수)에 대해서는 @st.cache_data를 사용하세요. 데이터베이스 연결이나 ML 모델 같은 싱글턴 리소스(한 번 초기화하고 재사용해야 하는 객체)에 대해서는 @st.cache_resource를 사용하세요. 이전의 @st.cache를 적절한 새로운 데코레이터로 대체하면 더 나은 성능과 디프리케이션 경고 회피 효과를 얻을 수 있습니다.
함수 입력을 신경 쓰기: 캐시된 함수는 입력 인수에 따라 무효화됩니다. 캐시된 함수를 새로운 인수 값으로 호출하면 함수가 다시 실행되어 새로운 결과를 캐시합니다. 이는 데이터 업데이트에 유용합니다. 예:
@st.cache_data
def load_data(filename):
return pd.read_csv(filename)
file_choice = st.selectbox("Choose a data file", ["data1.csv", "data2.csv"])
df = load_data(file_choice)
st.dataframe(df.head())이 경우 사용자가 "data1.csv"에서 "data2.csv"로 바꾸면 load_data는 새 파일명을 인수로 받아 다시 실행되어 해당 결과를 캐시합니다. 다시 "data1.csv"로 바꾸면 캐시에서 결과를 불러옵니다. 이 동작은 불필요한 재계산을 방지해 여러 데이터셋을 효율적으로 처리할 수 있게 합니다.
캐시된 데이터 변형 피하기: 캐시된 객체를 변경하는 것은 흔한 함정입니다. 예를 들어 DataFrame을 캐시한 뒤 그 객체를 제자리(in-place)로 수정하면 캐시된 객체에 그 변경이 지속되어 예기치 않은 결과를 초래할 수 있습니다. st.cache_data는 캐시된 데이터를 반환할 때 각 호출마다 새로운 복사본을 반환해 이러한 변이 문제를 방지합니다. 이전의 allow_output_mutation=True 같은 옵션을 사용할 필요가 거의 없습니다. 만약 캐시된 객체를 반드시 수정해야 하는 경우에는 신중하게 st.cache_resource를 사용하되 그 동작을 문서화하세요.
필요 시 캐시 지우기: 외부에서 데이터가 업데이트되어 캐시된 데이터를 갱신해야 할 때는 사용자가 수동으로 캐시를 지울 수 있는 버튼(st.cache_data.clear() 등)을 추가하거나 캐시 ttl(time-to-live) 또는 외부 데이터 버전의 해시를 캐시 키로 포함시키는 방법을 사용하세요. 예를 들어 데이터가 하루마다 갱신된다면 현재 날짜를 캐시 키의 일부로 포함하거나 @st.cache_data(ttl=86400)로 하루 후 만료되게 설정할 수 있습니다. 이렇게 하면 사용자가 오래된 데이터에 갇히는 것을 방지할 수 있습니다.
DataFrame 렌더링 크기 제한: 캐시가 있어도 거대한 DataFrame을 브라우저에 렌더링하는 것은 느릴 수 있습니다. 한 번에 표시할 DataFrame 양을 제한하는 것이 현명합니다. 앞서 설명한 height 파라미터나 수동 페이지네이션을 사용하세요. 또 다른 간단한 방법은 큰 데이터셋의 요약 정보나 샘플만 표시하고 전체 데이터는 다운로드 링크나 옵션으로 제공하는 것입니다. 앱은 현재 사용자의 분석에 가장 관련 있는 부분을 중심으로 설계되어야 하며 모든 데이터를 한 번에 보여주려 해서는 안 됩니다. 많은 데이터를 보여줘야 한다면 사용자는 검색과 스크롤 기능을 활용할 수 있지만 앱의 반응성을 유지하도록 주의하세요.
이러한 캐싱 및 성능 팁을 따르면 데이터가 증가해도 Streamlit 앱을 빠르고 효율적으로 유지할 수 있습니다.
Streamlit DataFrame: 고급 사용 사례
이 섹션에서는 Streamlit DataFrame이 중요한 역할을 하는 몇 가지 고급(그러나 흔한) 시나리오를 살펴봅니다: 인터랙티브한 데이터 필터링과 머신러닝 워크플로우에 DataFrame을 통합하는 방법입니다.
Streamlit DataFrame 필터링
데이터 필터링은 데이터 탐색의 핵심입니다. Streamlit의 위젯을 사용하면 DataFrame 표시를 위한 인터랙티브 필터를 쉽게 추가할 수 있습니다. 정적으로 미리 정의된 하위집합 대신 사용자가 DataFrame을 어떻게 필터링할지 선택하게 할 수 있습니다. 예를 들어 특정 숫자형 컬럼의 값 범위로 df를 필터링하도록 허용하려면 슬라이더와 selectbox를 사용할 수 있습니다:
# Assume df is already loaded
column = st.selectbox("Select column to filter", df.columns)
if pd.api.types.is_numeric_dtype(df[column]):
min_val, max_val = int(df[column].min()), int(df[column].max())
# Slider to pick a range within [min, max]
range_values = st.slider(f"Filter {column} between:", min_val, max_val, (min_val, max_val))
# Filter the dataframe based on slider
filtered_df = df[(df[column] >= range_values[0]) & (df[column] <= range_values[1])]
else:
# If non-numeric, maybe use multiselect for categories
options = st.multiselect(f"Filter values for {column}:", df[column].unique(), default=list(df[column].unique()))
filtered_df = df[df[column].isin(options)]
st.dataframe(filtered_df)이 예제에서는:
- 먼저 사용자가 필터링할 컬럼을 선택하게 합니다.
- 선택한 컬럼이 숫자형이면 해당 컬럼의 최솟값과 최댓값 범위를 슬라이더로 표시하고, 사용자의 선택을
(min_val, max_val)튜플로 받아 슬라이더 값에 맞춰 DataFrame을 필터링합니다. - 선택한 컬럼이 비수치(예: 문자열/카테고리)라면 여러 선택 위젯(multiselect)을 사용해 포함할 값을 골라 필터링합니다.
- 마지막으로
filtered_df를 표시합니다.
이 패턴은 다양한 시나리오에 맞게 확장할 수 있습니다: 여러 필터를 동시에 사용하거나(위젯과 조건을 추가) 컬럼 유형에 따라 다른 위젯(날짜 컬럼에는 date picker, 문자열에는 텍스트 포함 필터 등)을 사용할 수 있습니다. 그 결과 사용자가 실시간으로 DataFrame을 조합하고, 조건에 맞는 데이터만 즉시 테이블에서 확인할 수 있는 앱을 만들 수 있습니다.
머신러닝 앱에서의 Streamlit DataFrame 활용
Streamlit은 단순한 데이터 표시뿐 아니라 인터랙티브한 머신러닝 데모나 대시보드를 만드는 데 훌륭합니다. DataFrame은 ML 앱에서 자주 사용됩니다: 예를 들어 학습 데이터 미리보기, 피처 중요도 표, 사용자가 업로드한 새 데이터에 대한 예측 등입니다. 간단한 예시로, 사용자가 버튼 클릭으로 모델을 훈련시키고 결과를 표시하도록 하는 워크플로우를 생각해보겠습니다. DataFrame을 데이터 미리보기로 표시하고 Streamlit 위젯으로 상호작용을 관리할 수 있습니다:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Display the DataFrame (e.g., training dataset preview)
st.dataframe(df)
# Let user trigger model training
if st.button("Train Model"):
# Assume 'target' is the label column in df
if 'target' not in df.columns:
st.error("No target column found in data!")
else:
# Split the data
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train a simple RandomForest model
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# Evaluate the model
preds = model.predict(X_test)
accuracy = accuracy_score(y_test, preds)
# Display accuracy result
st.write(f"**Model Accuracy:** {accuracy*100:.2f}%")이 ML 앱 스니펫에서는 다음과 같은 일이 일어납니다:
- 사용자가 원본 데이터를 검사할 수 있도록 DataFrame
df를 표시합니다. - "Train Model" 버튼을 추가하고 사용자가 클릭하면
if st.button블록 내부 코드가 실행됩니다. - 예측할 라벨 컬럼인
target이 존재하는지 확인하는 간단한 검사 후 진행합니다. - DataFrame을 특성(X)과 타깃(y)으로 분리하고 학습/테스트 셋으로 나눕니다.
RandomForestClassifier를 초기화하고 학습시킵니다.- 테스트 셋에 대해 예측을 만들고 정확도(accuracy)를 계산합니다.
st.write로 정확도를 앱에 표시합니다.
이 간단한 예시는 DataFrame 표시와 인터랙티브 컨트롤을 결합해 작은 머신러닝 파이프라인을 만드는 방법을 보여줍니다. 사용자가 하이퍼파라미터(예: 트리 수, 테스트 비율)를 슬라이더로 조정하거나 다른 모델을 선택해 결과를 실시간으로 확인할 수 있습니다. DataFrame은 학습에 사용되는 데이터나 예측 결과(예: 오분류 사례 표)를 보여주는 핵심 수단으로 활용됩니다. Streamlit의 인터랙티브 DataFrame과 위젯을 결합하면 스크립트를 실습 가능한 앱으로 바꿀 수 있습니다.
결론
Streamlit 덕분에 인터랙티브한 데이터 앱을 만드는 것이 그 어느 때보다 쉬워졌으며, Pandas DataFrame과의 통합은 많은 강력한 기능을 제공합니다. 이 글에서는 Streamlit에서 DataFrame을 표시하는 기본 사용법부터 고급 커스터마이징까지 다루었습니다. 가독성을 높이기 위한 스타일링, 대규모 데이터셋을 효율적으로 처리하는 방법, 그리고 인터랙티브 필터링 및 머신러닝 사용 사례에서 DataFrame이 어떻게 활용되는지도 살펴보았습니다. 최신 Streamlit(2025년 기준)에서는 st.dataframe이 더욱 강력하고 성능이 향상되어 정렬, 검색, 다운로드 및 상당한 데이터 볼륨을 처리할 수 있는 스무스한 그리드 렌더링을 제공합니다. 또한 사용자가 데이터를 편집하거나 기여해야 하는 시나리오를 위해 st.data_editor도 소개되었습니다. 숙련된 데이터 과학자든 초보자든 Streamlit은 데이터 인사이트를 공유하기 위한 친절하고 강력한 플랫폼입니다. 노트북에서 정적으로 머물렀던 DataFrame을 Streamlit 앱에서는 인터랙티브한 탐색 도구로 바꿀 수 있습니다. 계속 사용하면서 성능을 위해 캐싱을 활용하고, 사용자 경험을 고려해 가장 관련 있는 데이터 슬라이스만 보여주며, 풍부한 스타일링 옵션으로 데이터를 명확하게 전달하세요. 이제 여러분의 Streamlit 앱에서 이 기술들을 시도해 보세요. DataFrame을 인터랙티브 테이블로 바꿔 대시보드를 구축하거나 다음 훌륭한 데이터 사이언스 웹 앱을 만들어 보세요. Pandas와 Streamlit을 결합하면 가능성은 무궁무진합니다!
Streamlit 앱을 Tableau처럼 바꿔주는 멋진 데이터 분석 및 시각화 도구를 들어보셨나요?
PyGWalker (opens in a new tab) 는 사용자가 자신의 Streamlit 앱에 tableau 대체 UI를 손쉽게 임베드할 수 있게 도와주는 Python 라이브러리입니다.
자주 묻는 질문
Streamlit에서 DataFrame을 어떻게 스타일링할 수 있나요? – Pandas 스타일링과 Streamlit의 표시 옵션을 함께 사용해 DataFrame을 스타일링할 수 있습니다. 예를 들어 highlight_max나 background_gradient 같은 Pandas Styler 메서드를 사용해 색상 하이라이트를 추가하세요. st.markdown과 unsafe_allow_html=True를 통해 커스텀 CSS를 적용해 간단한 스타일을 조정할 수도 있습니다(다만 고급 사용이며 제한적입니다). 또한 st.dataframe의 column_config를 활용해 컬럼 포맷(숫자 포맷, 인덱스 숨기기 등)을 손쉽게 지정할 수 있습니다.
Streamlit에서 DataFrame을 어떻게 필터링하나요? – Streamlit은 필터링을 쉽게 해주는 인터랙티브 위젯을 제공합니다. 범주형 필터에는 st.selectbox나 st.multiselect, 수치 범위에는 st.slider, 텍스트 검색에는 텍스트 입력 위젯 등을 사용하세요. 이러한 위젯 값들을 이용해 DataFrame을 서브셋하면 됩니다(예: df[df[column] == value] 또는 판다스 불리언 인덱싱을 사용해 범위 필터링). 사용자가 위젯을 조정하면 앱이 실시간으로 업데이트되어 필터된 데이터를 보여줍니다.
DataFrame 안에 이미지를 표시할 수 있나요? – Streamlit은 이미지를 표시할 수 있지만 현재로서는 st.dataframe 셀 안에 이미지를 직접 삽입하는 것은 제한적입니다. 일반적인 접근법은 DataFrame에 이미지 URL이나 파일 경로를 담은 컬럼을 가지고, 표 안에 이미지를 넣으려 하기보다 DataFrame을 순회하며 st.image()로 각 이미지를 표시하거나 st.columns를 사용해 그리드로 배치하는 것입니다. 경우에 따라 작은 썸네일 URL이 있으면 컬럼 구성에서 해당 컬럼을 Image 컬럼으로 표시할 수 있는 기능이 활성화되어 이미지를 직접 보여줄 수도 있습니다. 그러나 일반적으로 이미지는 st.dataframe 내부에 삽입하기보다 별도의 Streamlit 호출로 처리하는 편이 더 현실적입니다. 또한 이미지를 표시하려면 해당 이미지 데이터가 접근 가능(예: URL 또는 업로드된 파일)해야 합니다.
