【问题标题】:Python, Streamlit AgGrid add new row to AgGrid TablePython,Streamlit AgGrid 向 AgGrid 表添加新行
【发布时间】: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


【解决方案1】:

这是一个示例最小代码。

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


def generate_agrid(df):
    gb = GridOptionsBuilder.from_dataframe(df)
    gb.configure_selection(selection_mode="multiple", use_checkbox=True)
    gridoptions = gb.build()

    grid_response = AgGrid(
        df,
        height=200,
        gridOptions=gridoptions,
        update_mode=GridUpdateMode.MANUAL
    )
    selected = grid_response['selected_rows']

    # Show the selected row.
    if selected:
        st.write('selected')
        st.dataframe(selected)

    return grid_response


def add_row(grid_table):
    df = pd.DataFrame(grid_table['data'])

    new_row = [['', 100]]
    df_empty = pd.DataFrame(new_row, columns=df.columns)
    df = pd.concat([df, df_empty], axis=0, ignore_index=True)

    # Save new df to sample.csv.
    df.to_csv('sample.csv', index=False)


def get_data():
    """Reads sample.csv and return a dataframe."""
    return pd.read_csv('sample.csv')


if __name__ == '__main__':
    df = get_data()
    grid_response = generate_agrid(df)

    st.sidebar.button("Add row", on_click=add_row, args=[grid_response])

初始输出

按添加行后的输出

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 2021-01-20
    • 2023-02-19
    • 2018-10-12
    • 2023-01-19
    • 2023-02-24
    • 2018-10-13
    • 2021-01-10
    • 2019-01-20
    相关资源
    最近更新 更多