如何使用 streamlit ag-grid 选择过滤器行?

我正在使用 streamlit Ag-Grid 来显示一个表格。我允许用户使用过滤器选项进行过滤。

table filter

当用户过滤任何列时,它会按预期工作。

我现在想让用户只下载过滤后的行。

我知道这个功能仍在开发中,但是如果我可以允许用户通过单击“检查所有行”选项来检查所有过滤的行,它现在可以工作。

我知道这个选项是可用的,但我似乎无法让它出现。

你们能帮帮我吗?谢谢

gb = GridOptionsBuilder.from_dataframe(df)
gb.configure_default_column(enablePivot=True, enableValue=True, enableRowGroup=True)
gb.configure_selection(selection_mode="multiple", use_checkbox=True)
gb.configure_side_bar()
gridoptions = gb.build()

response = AgGrid(
    df,
    gridOptions=gridoptions,
    enable_enterprise_modules=True,
    update_mode=GridUpdateMode.MODEL_CHANGED,
    data_return_mode=DataReturnMode.FILTERED_AND_SORTED,
    fit_columns_on_grid_load=False,
    header_checkbox_selection_filtered_only=True,
    use_checkbox=True)
stack overflow how to select filter rows using streamlit ag-grid?
原文答案

答案:

作者头像

过滤的行将在响应中。响应是带有键 dataselected_rows 的字典。 selected_rows 是一个字典列表,我们只需将其转换为 pandas df 并进一步将其转换为 csv 以供下载。

##### 代码

from st_aggrid import AgGrid, GridOptionsBuilder, GridUpdateMode, DataReturnMode
import pandas as pd
import streamlit as st

data = {'cpu': ['Intel Core i7-12700K', 'Intel Core i9-12900K',
                'Intel Core i9-10850K', 'Intel Core i5-11400F'],
        'price': [350, 560, 300, 160]}

@st.cache
def convert_df(df):
    # IMPORTANT: Cache the conversion to prevent computation on every rerun
    return df.to_csv(index=False).encode('utf-8')

df = pd.DataFrame(data)

gb = GridOptionsBuilder.from_dataframe(df)
gb.configure_default_column(enablePivot=True, enableValue=True, enableRowGroup=True)
gb.configure_selection(selection_mode="multiple", use_checkbox=True)
gb.configure_side_bar()
gridoptions = gb.build()

response = AgGrid(
    df,
    height=200,
    gridOptions=gridoptions,
    enable_enterprise_modules=True,
    update_mode=GridUpdateMode.MODEL_CHANGED,
    data_return_mode=DataReturnMode.FILTERED_AND_SORTED,
    fit_columns_on_grid_load=False,
    header_checkbox_selection_filtered_only=True,
    use_checkbox=True)

# st.write(type(response))
# st.write(response.keys())

v = response['selected_rows']
if v:
    st.write('Selected rows')
    st.dataframe(v)
    dfs = pd.DataFrame(v)
    csv = convert_df(dfs)

    st.download_button(
        label="Download data as CSV",
        data=csv,
        file_name='selected.csv',
        mime='text/csv',
    )
示例输出

enter image description here

csv 输出
cpu,price
Intel Core i7-12700K,350
Intel Core i9-10850K,300
作者头像

我能够通过使用 response['data'] 以及第一个答案中的相同参数来获取过滤后的行

作者头像
# A little fix to the before solution

@st.cache
def convert_df(df):
    # IMPORTANT: Cache the conversion to prevent computation on every rerun
    return df.to_csv(index=False).encode('utf-8')

df = pd.DataFrame(data)

gb = GridOptionsBuilder.from_dataframe(df)
gb.configure_default_column(enablePivot=True, enableValue=True, enableRowGroup=True)
gb.configure_selection(selection_mode="multiple", use_checkbox=True)
gb.configure_side_bar()
gridoptions = gb.build()

response = AgGrid(
    df,
    height=200,
    gridOptions=gridoptions,
    enable_enterprise_modules=True,
    update_mode=GridUpdateMode.MODEL_CHANGED,
    data_return_mode=DataReturnMode.FILTERED_AND_SORTED,
    fit_columns_on_grid_load=False,
    header_checkbox_selection_filtered_only=True,
    use_checkbox=True)

    filterbtm = st.button('Get filred data')
    if filterebtn:
       st.table(response['data'])