【发布时间】:2022-11-18 10:08:27
【问题描述】:
我正在尝试使用 streamlit 和 python 将新行添加到 AgGrid 表
此时,我只想通过按“添加行”按钮向 AgGrid 生成的表中添加 1 个或多个新行。
按下“添加行”按钮后,我错误地用新行生成了第二个表,所以我得到了 2 个数据表而不是更新主表。
初始数据 df = get_data() 是从 SQL 查询中收集的。我想添加一个新行并(暂时)将其保存到 CSV 文件中,或者至少获取更新后的 DF,并将新行添加为输出并绘制图表
我当前的代码
import streamlit as st
from metrics.get_metrics import get_data
from metrics.config import PATH_SAMPLES
filename: str = 'updated_sample.csv'
save_path = PATH_SAMPLES.joinpath(filename)
def generate_agrid(data: pd.DataFrame):
gb = GridOptionsBuilder.from_dataframe(data)
gb.configure_default_column(editable=True) # Make columns editable
gb.configure_pagination(paginationAutoPageSize=True) # Add pagination
gb.configure_side_bar() # Add a sidebar
gb.configure_selection('multiple', use_checkbox=True,
groupSelectsChildren="Group checkbox select children") # Enable multi-row selection
gridOptions = gb.build()
grid_response = AgGrid(
data,
gridOptions=gridOptions,
data_return_mode=DataReturnMode.AS_INPUT,
update_on='MANUAL', # <- Should it let me update before returning?
fit_columns_on_grid_load=False,
theme=AgGridTheme.STREAMLIT, # Add theme color to the table
enable_enterprise_modules=True,
height=350,
width='100%',
reload_data=True
)
data = grid_response['data']
selected = grid_response['selected_rows']
df = pd.DataFrame(selected) # Pass the selected rows to a new dataframe df
return grid_response
def onAddRow(grid_table):
df = pd.DataFrame(grid_table['data'])
column_fillers = {
column: (False if df.dtypes[column] == "BooleanDtype"
else 0 if df.dtypes[column] == "dtype('float64')"
else '' if df.dtypes[column] == "string[python]"
else datetime.datetime.utcnow() if df.dtypes[column] == "dtype('<M8[ns]')"
else '')
for column in df.columns
}
data = [column_fillers]
df_empty = pd.DataFrame(data, columns=df.columns)
df = pd.concat([df, df_empty], axis=0, ignore_index=True)
grid_table = generate_agrid(df)
return grid_table
# First data gather
df = get_data()
if __name__ == '__main__':
# Start graphing
grid_table = generate_agrid(df)
# add row
st.sidebar.button("Add row", on_click=onAddRow, args=[grid_table])
【问题讨论】:
-
一开始你打电话给
grid_table = generate_agrid(df),所以表格就写好了。当您按添加行时,您再次调用grid_table = generate_agrid(df)。这就是为什么你有两个表的原因。解决方案是只调用一次generate_agrid(df)。
标签: python pandas graph streamlit