我正在使用streamlit Ag-Grid来显示表格。我允许用户使用过滤器选项进行过滤。
当用户过滤任何列时,它会按预期工作。
我现在想允许用户仅下载过滤后的行。
我知道此功能仍在开发中,但是如果我可以允许用户通过单击“检查所有行”选项来检查所有过滤的行,那么它现在就可以使用。
我知道这个选项是可用的,但我似乎无法让它显示出来。
你们能帮我吗? 谢谢你
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)
过滤后的行将出现在响应中。响应是一个带有键
data
和 selected_rows
的字典。 selected_rows 是一个 dict 列表,我们只需将其转换为 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',
)
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'])
由于您使用
data_return_mode = DataReturnMode.FILTERED_AND_SORTED
作为 Aggrid 对象中的参数,过滤后的数据将作为完整数据存储在 response['data']
中。因此,要下载过滤后的数据,您只需下载 response['data']
中包含的数据框,就像通常下载任何其他数据框一样。例如:
df = response['data']
df.to_csv(index=False)