【问题标题】:save a modified dash datatable to dataframe将修改后的破折号数据表保存到数据框
【发布时间】:2019-11-20 09:39:45
【问题描述】:

我是 dash 的新手,我正在努力将在 dash 数据表上所做的编辑保存回数据框 这是我的数据表代码

import dash
from dash.dependencies import Input, Output, State
import dash_table
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import sqlalchemy

app = dash.Dash(__name__)


engine = sqlalchemy.create_engine('mysql+pymysql://root:@127.0.0.1:3306/sfp')

df = pd.read_sql_table("base_case",engine)

app.layout = html.Div([
    html.Div([
        dcc.Input(
            id='adding-rows-name',
            placeholder='Enter a column name...',
            value='',
            style={'padding': 10}
        ),
        html.Button('Add Column', id='adding-rows-button', n_clicks=0)
    ], style={'height': 50}),

    dash_table.DataTable(
        id='adding-rows-table',
        columns=[{"name": i, "id": i} for i in df.columns],
        data=df.to_dict('records'),
        editable=True,
        row_deletable=True
    ),

    html.Button('Add Row', id='editing-rows-button', n_clicks=0),
])

if __name__ == '__main__':
    app.run_server(debug=True)

有什么解决办法吗?

【问题讨论】:

    标签: python flask plotly-dash


    【解决方案1】:

    您需要一个回调,这是一个示例:

    import dash
    import dash_table
    import dash_core_components as dcc
    import dash_html_components as html
    import pandas as pd
    
    app = dash.Dash(__name__)
    
    df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
    
    nmb_clicks = 0
    app.layout = html.Div([
        dcc.Store(id='click-memory', data = {'nmb_clicks': nmb_clicks}),
        html.Div([
            dcc.Input(
                id='adding-rows-name',
                placeholder='Enter a column name...',
                value='',
                style={'padding': 10}
            ),
            html.Button('Add Column', id='adding-columns-button', n_clicks=nmb_clicks)
        ], style={'height': 50}),
    
        dash_table.DataTable(
            id='adding-rows-table',
            columns=[{"name": i, "id": i} for i in df.columns],
            data=df.to_dict('records'),
            editable=True,
            row_deletable=True
        ),
    
        html.Button('Add Row', id='editing-rows-button', n_clicks=0),
    ])
    
    @app.callback(dash.dependencies.Output('adding-rows-table', 'columns'),
                 [dash.dependencies.Input('adding-columns-button', 'n_clicks'),
                  dash.dependencies.Input('adding-rows-name', 'value')],
                 [dash.dependencies.State('click-memory', 'data')])
    def update_dropdown(click, name, data):
        if click != data['nmb_clicks']:
            if name not in df.columns:
                df[name] = [float('nan')] * len(df.index)
    
        return [{"name": i, "id": i} for i in df.columns]
    
    @app.callback(dash.dependencies.Output('click-memory', 'data'),
                 [dash.dependencies.Input('adding-columns-button', 'n_clicks')],
                 [dash.dependencies.State('click-memory', 'data')])
    def on_data(click, data):
        if click != nmb_clicks:
            data['nmb_clicks'] = data['nmb_clicks'] + 1
    
        return data
    
    if __name__ == '__main__':
        app.run_server(debug=True)
    

    请注意,您需要用一些有意义的值填充该列(现在正在插入空单元格)。

    【讨论】:

    • 我已经实现了我需要将可编辑表中的修改数据保存到新的数据框
    • 在您的问题中,您说“保存回数据框”而不是“保存到新数据框”。所以你只需要将当前数据帧的副本保存到一个新的?
    • 你可以在update_dropdown回调中做new_df = df[0:1]
    • 有点晚了,但是来自 DataTable 的数据是一个两列 DataTable 的字典列表,例如 [{col: value, col: value}, {col: value, col: value}]。你能做到df =pd.DataFrame(data)吗?还有这个:community.plotly.com/t/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多